ASP.NET MVC 使用数据库表跨多个向导步骤持久保存数据
ASP.NET MVC persisting data across multiple wizard steps using database tables
在 ASP.NET MVC 中的几个向导步骤中使用数据库 tables 实现数据持久性的最佳方法是什么?
目前我们正在使用一个会话来跨多个向导 steps/views 保存大量数据。我们遇到了一个问题,我们怀疑会话超时是罪魁祸首。出于这个原因,我们决定用数据库 tables 替换会话。
到目前为止,我们已经确定我们需要以下内容:
当用户点击第一页时,一个独特的 id/token(可能
数据库主键)生成,这将确定数据在哪里
在整个工作流程中存储。此 id/token 使用
URL,如果可能的话,这样我们就不需要重新实现会话
每个向导 table 分开 view/step。我们在每个操作中实现了逻辑来测试存储在会话中的向导步骤对象,以确保用户不能跳过工作流中的步骤。与单个 table
相比,将数据分成不同的 tables 来实现类似的数据库数据持久性测试会更容易
在与所提供的 id/token 关联的记录中的某处存储过期时间戳以模拟会话超时,例如,如果当前日期时间大于存储日期,则在处理已发布的表单时时间戳拒绝请求
使用entity framework推拉数据
我们只是很难弄清楚如何在代码中实现它。我们遇到了 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;}
}
实施此方法的最佳方式是什么?我们如何 create/track 这个确定数据从何处提取的唯一令牌?我们如何测试用户是否完成了前面的步骤并且没有尝试跳过?感谢任何有关我们如何实施此方法的控制器 code/thoughts。
以下是我们过去实现类似模式的方式。
我在这里假设您的用户没有在系统中注册(如果他们注册了就容易一些)
向导的第一步是收集用户的电子邮件地址。
我们为此会话生成一个唯一的令牌并将其嵌入到 url 中并通过电子邮件发送给用户。用户可以使用它随时返回并完成工作流程。您需要使令牌足够大,这样人们就不能随便猜测随机令牌。
注意:我们实际上生成了一个 Token Id,我们在内部使用它来映射到工作流过程。我们还生成一个嵌入到 url 中并发送给用户的哈希值。
我们使用我们的普通实体 table 而不是每个步骤单独的 table 并且在这些之上,我们有一个 table links 实体数据的用户令牌并指示状态,我们使用该状态来确定它们在向导中的进度。这意味着您有一个基本路线,它确定当前步骤并转移到该步骤的正确路线。
令牌会定期清理,即删除超过 2 周的令牌。 url 用户收到的电子邮件仍然有效,但会将他们带到新的工作流程,并且令牌会在新会话中重复使用。
最后,如果工作流程完成,我们可以从系统中删除令牌。
如果用户已注册到系统中,那么您无需向他们发送电子邮件,您只需要以某种方式link向用户发送您的工作流程。
在 ASP.NET MVC 中的几个向导步骤中使用数据库 tables 实现数据持久性的最佳方法是什么?
目前我们正在使用一个会话来跨多个向导 steps/views 保存大量数据。我们遇到了一个问题,我们怀疑会话超时是罪魁祸首。出于这个原因,我们决定用数据库 tables 替换会话。
到目前为止,我们已经确定我们需要以下内容:
当用户点击第一页时,一个独特的 id/token(可能 数据库主键)生成,这将确定数据在哪里 在整个工作流程中存储。此 id/token 使用 URL,如果可能的话,这样我们就不需要重新实现会话
每个向导 table 分开 view/step。我们在每个操作中实现了逻辑来测试存储在会话中的向导步骤对象,以确保用户不能跳过工作流中的步骤。与单个 table
相比,将数据分成不同的 tables 来实现类似的数据库数据持久性测试会更容易
在与所提供的 id/token 关联的记录中的某处存储过期时间戳以模拟会话超时,例如,如果当前日期时间大于存储日期,则在处理已发布的表单时时间戳拒绝请求
使用entity framework推拉数据
我们只是很难弄清楚如何在代码中实现它。我们遇到了 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;}
}
实施此方法的最佳方式是什么?我们如何 create/track 这个确定数据从何处提取的唯一令牌?我们如何测试用户是否完成了前面的步骤并且没有尝试跳过?感谢任何有关我们如何实施此方法的控制器 code/thoughts。
以下是我们过去实现类似模式的方式。 我在这里假设您的用户没有在系统中注册(如果他们注册了就容易一些)
向导的第一步是收集用户的电子邮件地址。
我们为此会话生成一个唯一的令牌并将其嵌入到 url 中并通过电子邮件发送给用户。用户可以使用它随时返回并完成工作流程。您需要使令牌足够大,这样人们就不能随便猜测随机令牌。
注意:我们实际上生成了一个 Token Id,我们在内部使用它来映射到工作流过程。我们还生成一个嵌入到 url 中并发送给用户的哈希值。
我们使用我们的普通实体 table 而不是每个步骤单独的 table 并且在这些之上,我们有一个 table links 实体数据的用户令牌并指示状态,我们使用该状态来确定它们在向导中的进度。这意味着您有一个基本路线,它确定当前步骤并转移到该步骤的正确路线。
令牌会定期清理,即删除超过 2 周的令牌。 url 用户收到的电子邮件仍然有效,但会将他们带到新的工作流程,并且令牌会在新会话中重复使用。
最后,如果工作流程完成,我们可以从系统中删除令牌。
如果用户已注册到系统中,那么您无需向他们发送电子邮件,您只需要以某种方式link向用户发送您的工作流程。