【问题标题】:Redirect Url After Form Submission提交表单后重定向 URL
【发布时间】:2015-09-18 12:36:26
【问题描述】:

我有一个允许用户创建Employee 的基本表单。一旦用户选择了submit 按钮,页面应该是redirected 到一个摘要页面。此摘要页面需要显示在 Employee 表单中添加的详细信息。

例如,我有一个如下所示的表单:

一旦用户选择Submit,它应该将用户重定向到以下页面:

我遇到的问题是获取 重定向 url。 我的 url 看起来像:http://www.localhost.com/Employee/1234/ 1234 代表 Employee id。我怎样才能拉那个Employee Id?

我当前的 HTML

<button type="submit" name="saveButton" id="saveBtn" class="btn btn-primary">Submit</button>

请注意,我使用的是 .NET,因此我愿意使用 Razor Syntax.

故事更新

在阅读了您所有的 cmets 之后,我深入挖掘了我的问题。这是我发现的。

有一个RouteConfig.cs 文件,路径如下:

routes.MapRoute(
  name: "ListEmployee",
  url: "Employee/{employeeId}",
  defaults: new { controller = "Employee", action = "List"},
  constraints: new {employeeId = "\\d+"}
)

因为我有这个路由,所以我决定修改这个控制器方法来利用它:

[HttpPost]
public ActionResult AddEmployee(ViewModel<EmployeeModel> model)
{
  // logic here

  return RedirectToAction("ListEmployee", new { employeeId = model.Body.Employee.Id, fromEmployeeProject = true });
}

问题:这完全崩溃了。声明:No route in the route table matches the supplied values.关于我做错了什么有什么想法吗?

【问题讨论】:

  • 表单提交后,我的代码需要找到分配给该用户的EmployeeId。例如,提交后,我的URL 将如下所示:http://www.localhost.com/Employee/1234
  • 是否需要员工id才能在“摘要”页面显示新添加的Employee对象?
  • 没错。我需要那个 Employee Id 以便我可以查看特定 Employee 的摘要
  • 如何保存员工记录? EmployeeId 属性是由服务器和/或数据库生成的吗?

标签: c# html asp.net-mvc


【解决方案1】:

最常见的方法之一是从您从员工表单调用的操作中返回不同的视图。例如,假设您的员工表单调用 EmployeeController->Add(Employee employee) 操作

在您的 Employee Action 中,您将拥有如下内容:

[HttpPost]
public ActionResult Add(Employee employee)
{
    // process request and create new employee in repository

    return View("Summary");
}

另一种方法是调用 RedirectToAction(),这类似于 ASP.NET WebForms 中的 Response.Redirect()。

[HttpPost]
public ActionResult Add(Employee employee)
{
    // process request and create new employee in repository

    return RedirectToAction("Summary");
}

你也可以调用 Redirect 方法。这将导致浏览器收到 302 错误并重定向到您指定的控制器/操作

[HttpPost]
public ActionResult Add(Employee employee)
{
    // process request and create new employee in repository

    return Redirect("YourController/Summary");
}

【讨论】:

  • 感谢您的回复。这种方法可以让我拉Employee Id吗?
  • 是的,您需要正确构建您的 Route 才能获取 Employee Id,请查看msdn.microsoft.com/en-us/library/cc668201.aspx 或这个codeproject.com/Articles/641783/…
  • 感谢@Vlad Bezden,由于您的帖子,我深入研究了,现在遇到了一个新问题。我更新了我的故事以反映这个问题。
  • 您甚至可以执行 AddEmployee 操作吗?根据您的路由器配置,我怀疑。如果你参与了你的行动,请告诉我。您还可以提供提交表单时获得的网址。您可以从浏览器开发工具或使用 Fiddler 等工具获取 url。
【解决方案2】:

如果您使用的是实体框架 (EF),则在使用自动生成的 ID 时,它会在每个 INSERT 语句之后使用 SCOPE_IDENTITY()。

SCOPE_IDENTITY 返回插入到同一范围内的标识列中的最后一个标识值。 (MSDN)

因此,如果您的Employee ID 是数据库中自动生成的列,那么您应该能够在保存更改后立即获得该 ID:

[HttpPost]
public ActionResult Add(Employee employee)
{
    using (var context = new MyContext())
    {
        // add the employee object
        context.Employees.Add(employee);
        // save changes
        context.SaveChanges();
        // the id will be available here
        int employeeId = employee.Id;   
        // ..so perform your Redirect to the appropriate action, _
        // and pass employee.Id as a parameter to the action       
        return RedirectToAction("Index", "Employee", new { id = employeeId });            
    }
}

显然您没有向我们提供您的控制器和操作名称,因此请确保将它们替换为适当的值。

【讨论】:

  • 感谢@trashr0x,因为您的帖子,我进行了更深入的挖掘,但最终遇到了另一个错误。我已经更新了我的故事以反映该错误。有什么想法吗?
  • 您将路由名称传递给RedirectToAction,尝试RedirectToAction("Index", "Employee", //...)(或您的控制器和操作的任何名称)
  • 最终使用了与您的 return 声明非常相似的内容。 new {....} 特别有用。谢谢
【解决方案3】:

要获取 id,您可以在视图中添加一个隐藏的输入类型:

<input type="hidden" name="id" value="[value]" />

在您的控制器中:

[HttpPost]
public ActionResult [ActionName] (int id)
{
.....
employeeRepository.Save(employee);
return RedirectToAction("Summary", new {id});
}

在你的行动总结:

public ActionResult Summary(int id)
{
.....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2013-04-13
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多