我正在MVC2中开发向导类型的解决方案,但我想防止用户直接进入第2步,但是,我仍然希望它显示在URL中。
另外,由于可以随时保存进度,因此我仍然希望能够以编程方式转到Step2。我怎样才能做到这一点?
[HttpGet]
public ActionResult Step1() {
return View("Step1View");
}
[HttpPost]
public ActionResult Step1(Stuff s) {
return RedirectToAction("Step2", new { S = s });
}
[HttpGet] //<-- how do I stop users going directly here
public ActionResult Step2(Stuff s) {
return View();
}
[HttpPost]
public ActionResult Step2(Stuff2 s) {
return RedirectToAction("Step3");
}
最佳答案
Action 过滤器是必经之路
首先,这将在很大程度上取决于您临时保存的数据的存储系统。 Action 过滤器应检查此存储,并查看是否存在步骤1的数据。如果不是这样,您可以随时向ModelState
添加错误,从而使其无效。因此,您的第2步代码如下所示:
[HttpGet]
[CheckExistingData]
public ActionResult Step2(Stuff s)
{
if (!this.ModelState.IsValid)
{
return RedirectToAction("Step1");
}
return View(s);
}
所以。您的过滤器应检查现有数据,并且可以:
Stuff
参数或资料整合
您编写重定向到操作(在第1步POST中)以仅提供一个复杂对象的方式并不是一种好的方法。您应该合并数据存储,因此无论您的用户进入第2步的哪个位置,过滤器都将始终起作用。在第1步POST中,您应该将数据保存到该特定存储中,然后重定向到第2步。
您有两种情况可以进入第2步:
这样,您的步骤2将在两种情况下均相同。您可以在向导中创建任意数量的步骤,并且相同的过程仍然可以相同地工作。
关于asp.net-mvc - 如何防止直接调用操作方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871641/