3

我正在开发一个 ASP.NET MVC 4 应用程序。这个应用程序需要一个向导。该向导包含三个屏幕。我需要他们的 URL 映射到:

/wizard/step-1
/wizard/step-2
/wizard/step-3

在我的 WizardController 中,我有以下操作:

public ActionResult Step1()
{
  var model = new Step1Model();
  return View("~/Views/Wizard/Step1.cshtml", model);
}

[HttpPost]
public ActionResult AddStep1(Step1Model previousModel)
{
  var model = new Step2Model();
  model.SomeValue = previousModel.SomeValue;

  return View("~/Views/Wizard/Step2.cshtml", model);
}

[HttpPost]
public ActionResult AddStep2(Step2Model previousModel)
{
  var model = new Step3Model();
  return View("~/Views/Wizard/Step3.cshtml", model);
}

虽然这种方法有效,但我的问题是浏览器 URL 没有更新。如何发布步骤中的值并将用户重定向到具有不同数据模型的新 URL?

谢谢!

4

1 回答 1

2

在您调用的每个向导视图中Html.BeginForm(),确保调用它的重载,以接受所需的路由或所需的控制器、操作和其他路由参数。例如,在 Step1.cshtml 中:

@using (Html.BeginForm("Step-2", "MyWizard")) {
    // put view stuff in here for step #1, which will post to step #2
}

这将使目标 URL “漂亮”,但不会修复动作名称本身“丑陋”。为了解决这个问题,MVC 中有一个功能可以将操作方法​​“重命名”为您想要的几乎任何东西:

[HttpPost]
[ActionName("step-2")] // this will make the effective name of this action be "step-2" instead of "AddStep1"
public ActionResult AddStep1(Step1Model previousModel)
{
    // code here
}

假设应用程序使用默认的 MVC 路由(控制器/操作/id),每个步骤都有自己的 URL。

于 2013-02-05T18:10:49.767 回答