如何防止直接调用操作方法?

9 asp.net-mvc

我正在开发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");
        }
Run Code Online (Sandbox Code Playgroud)

Rob*_*nik 1

动作过滤器是正确的选择

首先,这在很大程度上取决于临时保存数据的存储系统。操作过滤器应检查此存储并查看步骤 1 数据是否存在。如果没有,您可以随时添加错误以ModelState使其无效。因此,您的第 2 步代码将如下所示:

[HttpGet]
[CheckExistingData]
public ActionResult Step2(Stuff s)
{
    if (!this.ModelState.IsValid)
    {
        return RedirectToAction("Step1");
    }
    return View(s);
}
Run Code Online (Sandbox Code Playgroud)

所以。您的过滤器应检查现有数据,并且:

  • 填写Stuff参数或
  • 添加模型状态错误并保持参数为空

数据整合

您编写重定向到操作(在步骤 1 POST 中)以仅提供复杂对象的方式并不是一个好方法。您应该整合数据存储,因此无论您的用户在哪里执行第 2 步,过滤器都将始终以相同的方式工作。在步骤 1 POST 中,您应该将数据保存到此特定存储,然后重定向到步骤 2。

进入步骤 2 的情况有两种:

  1. 从步骤 1 开始
  2. 保存数据后可从任何地方

这样,您的步骤 2 对于这两种情况都是相同的。您可以在向导中创建任意数量的步骤,并且相同的过程仍然会以相同的方式工作。