ASP.. NET MVC使用数据库表跨多个向导步骤持久化数据
本文关键字:向导 数据 持久化 MVC NET 数据库 ASP | 更新日期: 2023-09-27 18:06:04
在ASP中通过几个向导步骤使用数据库表实现数据持久性的最佳方法是什么?净MVC吗?
目前,我们正在使用会话来跨几个向导步骤/视图持久化大量数据。我们遇到了一个问题,我们怀疑会话超时是罪魁祸首。出于这个原因,我们决定用数据库表代替会话。
到目前为止,我们已经确定我们需要以下内容:
-
当用户点击第一页一个唯一的id/令牌(可能)数据库主键),它将确定数据的位置存储在整个工作流中。对象持久化此id/令牌URL,如果可能的话,这样我们就不需要重新实现会话
-
为每个向导视图/步骤单独的表。我们已经在每个操作中实现了逻辑,测试存储在会话中的向导步骤对象,以确保用户不能跳过工作流中的步骤。与使用单个表
相比,使用数据库数据持久性实现类似的测试将更容易将数据分离到不同的表中。 在与所提供的id/令牌相关的记录中存储过期时间戳,以模拟会话超时,例如在处理提交的表单时,如果当前日期时间大于存储的日期时间戳,则拒绝请求
使用实体框架推送和拉取数据
我们只是很难弄清楚如何在代码中实现它。我们遇到了https://web.archive.org/web/20211020145945/https://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();
}
<<p> 向导模型/strong> public WizardViewModel
{
public StepOne { get; set; }
public StepTwo { get; set;}
}
实现这种方法的最佳方法是什么?我们如何创建/跟踪这个确定从哪里提取数据的唯一令牌?我们如何测试用户已经完成了前面的步骤,而不是试图跳过?任何关于我们如何实现这种方法的控制器代码或想法都是值得赞赏的。
下面是我们过去实现类似模式的方法。我在这里假设您的用户没有在系统中注册(如果他们是,那么这就容易一些)
-
向导的第一步是收集用户的电子邮件地址。
-
我们为这个会话生成一个唯一的令牌,并将其嵌入到url中并通过电子邮件发送给用户。这可以被用户用来在任何时候回来完成工作流程。你需要让令牌足够大,这样人们就不能随意猜测令牌。
注意:我们实际上生成了一个Token Id,我们在内部使用它来映射到工作流过程。我们还生成一个嵌入到url并发送给用户的哈希值。
-
不是为每一步单独的表,我们使用常规的实体表,在这些表之上,我们有一个将用户令牌链接到实体数据并指示状态的表,我们用它来确定它们在向导中走了多远。这意味着你有一个基本路线,它决定当前的步骤,并转移到该步骤的正确路线。
-
代币被定期清理,即超过2周的代币被删除。用户被发送电子邮件的url仍然有效,但将他们带到一个新的工作流,并且令牌被重新用于新会话。
-
最后,如果工作流完成,我们可以从系统中删除令牌。
如果用户已经注册到系统中,那么你不需要给他们发电子邮件,你只需要以某种方式将你的工作流链接到用户。