ASP.NET MVC 使用数据库表跨多个向导步骤持久保存数据

ASP.NET MVC persisting data across multiple wizard steps using database tables

在 ASP.NET MVC 中的几个向导步骤中使用数据库 tables 实现数据持久性的最佳方法是什么?

目前我们正在使用一个会话来跨多个向导 steps/views 保存大量数据。我们遇到了一个问题,我们怀疑会话超时是罪魁祸首。出于这个原因,我们决定用数据库 tables 替换会话。

到目前为止,我们已经确定我们需要以下内容:

我们只是很难弄清楚如何在代码中实现它。我们遇到了 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。

以下是我们过去实现类似模式的方式。 我在这里假设您的用户没有在系统中注册(如果他们注册了就容易一些)

  1. 向导的第一步是收集用户的电子邮件地址。

  2. 我们为此会话生成一个唯一的令牌并将其嵌入到 url 中并通过电子邮件发送给用户。用户可以使用它随时返回并完成工作流程。您需要使令牌足够大,这样人们就不能随便猜测随机令牌。

注意:我们实际上生成了一个 Token Id,我们在内部使用它来映射到工作流过程。我们还生成一个嵌入到 url 中并发送给用户的哈希值。

  1. 我们使用我们的普通实体 table 而不是每个步骤单独的 table 并且在这些之上,我们有一个 table links 实体数据的用户令牌并指示状态,我们使用该状态来确定它们在向导中的进度。这意味着您有一个基本路线,它确定当前步骤并转移到该步骤的正确路线。

  2. 令牌会定期清理,即删除超过 2 周的令牌。 url 用户收到的电子邮件仍然有效,但会将他们带到新的工作流程,并且令牌会在新会话中重复使用。

  3. 最后,如果工作流程完成,我们可以从系统中删除令牌。

如果用户已注册到系统中,那么您无需向他们发送电子邮件,您只需要以某种方式link向用户发送您的工作流程。