在 ASP.NET MVC 中通过几个向导步骤使用数据库表实现数据持久性的最佳方法是什么?
目前,我们正在使用会话在多个向导步骤/视图中保存大量数据。我们遇到了一个问题,我们怀疑会话超时是罪魁祸首。出于这个原因,我们决定用数据库表替换会话。
到目前为止,我们已经确定我们需要以下内容:
当用户点击第一页时,会生成一个唯一的 id/token(可能是数据库主键),它将确定整个工作流程中数据的存储位置。如果可能的话,这个 id/token 会使用 URL 持久化,这样我们就不需要重新实现会话
每个向导视图/步骤的单独表格。我们在每个操作中实现了测试存储在会话中的向导步骤对象的逻辑,以确保用户不能跳过工作流中的步骤。将数据分成不同的表而不是单个表,使用数据库数据持久性实现类似的测试会更容易
在与提供的 id/token 关联的记录中的某处存储过期时间戳以模拟会话超时,例如,如果当前日期时间大于存储的日期时间戳,则在处理发布的表单时拒绝请求
使用实体框架推送和拉取数据
我们只是很难弄清楚如何在代码中实现这一点。我们遇到了http://www.4guysfromrolla.com/webtech/041600-2.shtml这有点帮助,但并没有真正解释如何在 ASP.NET MVC 控制器中实现它。
我们在下面提供了一段代码,以帮助我们了解我们目前如何使用会话进行操作:
控制器
[HttpGet]
public ActionResult StepOne() {
StepOneViewModel stepOneModel;
WizardViewModel wizard = (WizardViewModel)Session["Wizard"];
if(wizard == null || wizard.StepOne == null)
stepOneModel = new StepOneViewModel();
else
stepOneModel = wizard.StepOne
return View();
}
[HttpPost]
public ActionResult StepOne()
{
//validate and store data into wizard session object
}
public ActionResult StepTwo()
{
StepTwoViewModel stepTwoModel;
WizardViewModel wizard = (WizardViewModel)Session["Wizard"];
if(wizard == null || wizard.StepOne == null)
return RedirectToAction("StepOne");
if(wizard.StepTwo == null)
stepTwoModel = new StepTwoViewModel();
else
stepTwoModel = wizard.StepTwo;
Session["Wizard"] = wizard;
return View();
}
向导模型
public WizardViewModel
{
public StepOne { get; set; }
public StepTwo { get; set;}
}
实施这种方法的最佳方法是什么?我们如何创建/跟踪这个确定数据从哪里提取的唯一令牌?我们如何测试用户是否完成了之前的步骤并且没有尝试跳过?任何关于我们如何实现这种方法的控制器代码/想法都值得赞赏。