簡體   English   中英

ASP.NET MVC使用數據庫表跨多個向導步驟持久保存數據

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

在ASP.NET MVC的多個向導步驟中,使用數據庫表實現數據持久性的最佳方法是什么?

目前,我們正在使用一個會話在多個向導步驟/視圖之間保留大量數據。 我們遇到了一個問題,我們懷疑是會話超時造成的。 因此,我們決定用數據庫表替換會話。

到目前為止,我們已經確定我們需要以下內容:

  • 當用戶點擊首頁時,將生成一個唯一的ID /令牌(可能是數據庫主鍵),該ID /令牌將確定整個工作流程中數據的存儲位置。 如果可能,此ID /令牌將使用URL持久保存,因此我們無需重新實現會話

  • 每個向導視圖/步驟的單獨表。 我們在每個操作中都實現了邏輯,以測試存儲在會話中的向導步驟對象,以確保用戶不能跳過工作流程中的步驟。 通過將數據分離到不同的表(而不是單個表)中,使用數據庫數據持久性實施類似的測試會更容易

  • 將過期時間戳存儲在與提供的id /令牌關聯的記錄中的某個位置上,以模仿會話超時,例如,如果當前日期時間大於存儲的日期時間戳,則在處理發布的表單時拒絕請求

  • 使用實體框架推送和拉取數據

我們只是很難確定如何在代碼中實現這一點。 我們遇到了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;}
}

實施此方法的最佳方法是什么? 我們如何創建/跟蹤這個確定從何處提取數據的唯一令牌? 我們如何測試用戶已經完成了先前的步驟並且沒有試圖跳過? 任何有關我們如何實現此方法的控制器代碼/想法都值得贊賞。

這就是我們過去實現類似模式的方式。 我在這里假設您的用戶未在系統中注冊(如果這樣,那么會容易一些)

  1. 向導的第一步是收集用戶的電子郵件地址。

  2. 我們為此會話生成一個唯一的令牌,並將其嵌入url並將其通過電子郵件發送給用戶。 用戶可以使用它隨時返回並完成工作流程。 您需要使令牌足夠大,以使人們無法猜測隨機令牌。

注意:實際上,我們會生成一個令牌ID,我們在內部使用它來映射到工作流程。 我們還會生成一個嵌入到url中並發送給用戶的哈希。

  1. 我們沒有使用每個步驟的單獨表,而是使用普通的實體表,在這些表的頂部,我們還有一個表,該表將用戶令牌鏈接到實體數據並指示狀態,我們可以使用該表來確定通過向導的距離是。 這意味着您有一條基本路線,該路線確定當前步驟並轉移到該步驟的正確路線。

  2. 例行清理令牌,即刪除超過2周的令牌。 通過電子郵件發送給用戶的url仍然有效,但是將其帶到新的工作流程中,並且令牌被重新用於新的會話。

  3. 最后,如果工作流程完成,我們可以從系統中刪除令牌。

如果用戶已注冊到系統中,則無需通過電子郵件向他們發送電子郵件,只需以某種方式將工作流程鏈接到用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM