asp.net-mvc - 如何防止直接调用操作方法?

标签 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");
        }

最佳答案

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步:
  • 从第1步开始
  • 保存数据后的任何地方

  • 这样,您的步骤2将在两种情况下均相同。您可以在向导中创建任意数量的步骤,并且相同的过程仍然可以相同地工作。

    关于asp.net-mvc - 如何防止直接调用操作方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871641/

    相关文章:

    asp.net-mvc - WebAPI HttpContext 缓存 - 有可能吗?

    c# - 如何为mvc项目设置架构

    jquery - 如何使用 jQuery 在 MVC3 中单击按钮时显示弹出窗口?

    asp.net - 调试时导出 IIS 进程内 session 数据

    c# - 使用大 URL 查询进行路由

    asp.net - 我可以使用 owin 和 oauth 提供商的 asp.net 成员(member)资格吗?

    javascript - 在 mvc 中使用 ajax 或 jquery 更改 View

    asp.net-mvc - 我应该在哪里放置可以重定向请求的检查?

    javascript - 使用 jQuery 设置动态下拉列表 (DOM) 的选定索引

    asp.net - 重定向到操作是在添加 SSL 后在 url 末尾添加 %20