Asp.net

在 <sessionState mode=‘Off’ /> 時使用 TempData

  • May 27, 2012

我試圖減少一個站點的會話。所以添加 &lt;sessionState mode="Off" /&gt; 到我的 web.config 中。之後,如果我執行

Session["test"] = "yes"; 

我收到錯誤“對象引用未設置為對象的實例。“ 這可以。

但是有了這個配置,我可以設置

TempData["test"] = "yes"; 

TempData["test"];在控制器中並在查看頁面中列印。它運作良好。

根據MSDN “TempData 屬性值儲存在會話狀態中”。

那麼,如果我提到&lt;sessionState mode="Off" /&gt;TempData 是如何工作的?ASP.NET 是否仍將 TempData 儲存在會話或其他地方?

僅當您在同一請求期間在視圖上列印時,這才適用於禁用會話狀態TempData["test"]- 因此此值已從 TempData 字典中刪除,並且 MVC 不會嘗試將其保存到會話狀態。嘗試將其從您的視圖中刪除,您將得到System.InvalidOperationException: The SessionStateTempDataProvider class requires session state to be enabled.

您可以通過添加屬性或使用介面[SessionState(SessionStateBehavior.Disabled)]實現您自己的 TempData 提供程序來單獨禁用控制器的會話狀態。ITempDataProvider

$$ EDIT $$為了解釋我的第一點,讓我們想像兩種情況:

  • 您有控制器操作,它分配一些值,TempData["test"]以及從該操作返回並列印此數據的相應視圖。在這種情況下,即使沒有會話狀態,一切都會正常工作,因為不需要TempData["test"]在請求之間進行儲存。
  • 您有控制器操作,它分配一些值,TempData["test"]但將使用者重定向到另一個操作,該操作具有自己的列印此數據的視圖。在這種情況下,它不會在會話狀態禁用的情況下工作,因為 MVC 需要TempData["test"]在兩個請求之間儲存您的值。

引用自:https://stackoverflow.com/questions/10772773