2011-07-20 69 views
1

我對.NET和ASP.NET MVC還比較陌生,我曾經有過幾次將DB從數據庫中檢索出來的信息臨時存儲起來,所以它可以用於來自客戶端的後續服務器請求。我已經開始使用.NET會話來存儲這些信息,並將其從時間戳中取出,然後在再次點擊服務器時使用時間戳檢索信息。使用.NET Session進行臨時存儲的最佳實踐?

所以基本用例:

  1. 用戶點擊「查詢」按鈕,從收集系統信息。
  2. 在JS,產生的當前時間的時間戳,並與請求
  3. 在服務器把它傳遞給服務器,從DB
  4. 在服務器上收集信息,使用唯一的時間戳從客戶的鑰匙插入會話存儲響應對象。
  5. 返回響應對象中的客戶端
  6. 用戶點擊「生成報告」按鈕再次(將格式化查詢結果到Excel文檔)
  7. 傳遞相同的時間戳從2號到服務器,並使用從第4集查詢結果。
  8. 生成無額外數據庫命中的報告。

這是我開始在任何情況下使用會話作爲臨時存儲的方案。但在JS中生成時間戳並不一定安全,整個事情感覺有點...非結構化。有沒有我可以使用的現有設計模式,或更簡化/安全的方法?任何幫助,將不勝感激。

謝謝。

+0

JS時間戳的目的是什麼? –

+0

JS時間戳旨在是一個唯一值,可用作Session變量的一個鍵。我們可以很容易地生成一個隨機數,但即使這樣也是可重複的。 –

回答

1

您可以看看TempData,它將數據存儲在Session中。當您從TempData中取出某些內容時,將在執行完Action後將其刪除。

所以,如果你把東西TempData在行動,將居住在所有其他行動TempData直到它要求從TempData的TempData一次。

您也可以撥打TempData.Peek("key")將其保存在內存中,直到您叫TempData["key"]TempData.Remove("key")

+0

據我所知,TempData只適用於當前請求和下一個請求。如果我將查詢的響應存儲在TempData中(大概是在他們單擊「生成報告」時進行檢索),並且用戶決定他們的下一個操作是Ctrl +單擊頁面上的鏈接而不是生成報告,我就出來了當他們決定生成報告時,他們很幸運。 ViewData只有通過Ctrl +單擊操作纔有效,並且不再包含響應​​對象。有很多文章說TempData僅適用於重定向和重定向。 –

1

好吧,我不知道我理解你正確的JS時間戳一步似乎是多餘的。 但這是我會做的。

public static string SessionReportKey = "Reports"; 
public static string ReportIDString = "ReportID"; 
public Dictionary<string, object> SessionReportData 
{ 
    get 
    { 
     return Session[SessionReportKey] == null ? 
      new Dictionary<string, object>() : 
      (Dictionary<string, object>) Session[SessionReportKey]; 
    } 
    set 
    { 
     Session[SessionReportKey] = value; 
    } 
} 
public ActionResult PreviewReport() 
{ 
    //retrive your data 
    object reportData = GetData(); 

    //get identifier 
    string myGUID = new GUID().ToString(); 

    //might only need [SessionReportData.Add(myGUID, reportData);] here 
    SessionReportData = SessionReportData.Add(myGUID, reportData); 

    //in your view make a hyperlink to PrintReport action with a 
    //query string of [?ReportID=<guidvalue>] 
    ViewBag[ReportIDString] = myGUID; 

    return View(reportData); 
} 


public FileContentResult PrintReport() 
{ 
    if(SessionReportData[QueryString[ReportIDString]] == null) 
    { 
     //error no report in session 
     return null; 
    } 
    return GenerateFileFromData(SessionReportData[QueryString[ReportIDString]]); 
}