0

在 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;}
}

实施这种方法的最佳方法是什么?我们如何创建/跟踪这个确定数据从哪里提取的唯一令牌?我们如何测试用户是否完成了之前的步骤并且没有尝试跳过?任何关于我们如何实现这种方法的控制器代码/想法都值得赞赏。

4

1 回答 1

0

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

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

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

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

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

  2. 令牌会被定期清理,即超过 2 周的令牌会被移除。用户通过电子邮件发送的 url 仍然有效,但会将他们带到新的工作流程,并且令牌会被重新用于新会话。

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

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

于 2016-09-08T03:07:36.557 回答