ASP.NET MVC表单向导使用URL栏阻止用户跳过向导步骤(Controller Action)

时间:2016-04-25 12:53:23

标签: c# asp.net asp.net-mvc session actionresult

我目前正在处理一个非常大的表格。我认为通过实现表单向导(多个视图/操作结果)来划分表单是个好主意,以改善用户体验。

一个要求是用户必须完成一项小型资格测试,以确保它们在启动应用程序向导之前满足最低要求。

之前我没有做过这样的事情,我只能看到这个问题的一种方法,并且在会话中使用一个标志,例如IsEligible,用于确定用户是否可以访问表单向导视图。假设我的控制器有两个服务器分开视图的ActionResults(Eligibility和WizardStepOne)。例如:

控制器 - 未经测试的代码

public ActionResult Eligibility()
{
   Return View();
}

[HttpPost]
public ActionResult Eligibility(EligibilityViewModel model)
{
   if(!ModelState.IsValid)
   {
      return View(model);
   }

   Session["IsEligible"] = true;

   return("Success");
}

public ActionResult WizardStepOne()
{
   bool stuff = (bool)Session["stuff"];

   if(IsEligible == null)
   {
      return("Eligibility");
   }

   return RedirectToAction("Eligibility");
}

简而言之,如果用户尝试访问向导的第一步并且ElEibility post操作尚未设置IsEligible标志,则用户将被重定向回资格表单。

我也研究了动作过滤器,但对它没有多大意义。我还必须在稍后阶段实现此功能,以防止用户使用URL跳过向导步骤,例如跳过WizardStepOne并从WizardStepTwo开始。

在这种情况下,是否有一种比上述更好的方法?我宁愿避免使用会话,因为重新启动表单会出现问题,因为它需要重启按钮才能放弃会话,特别是在向导步骤之间。

1 个答案:

答案 0 :(得分:0)

您提到的内容听起来像您可能会使用一些简单的状态机来定义表单中的有效步骤。因此,当用户处于第3阶段时,您将检查他是否来自第2步。对于特定用户和会话的每个步骤>你可以在他的会话中保存一些哈希值。这样他们就无法直接输入网址了。