10

我试图减少一个站点的会话。所以添加 <sessionState mode="Off" /> 到我的 web.config 中。之后,如果我执行

 Session["test"] = "yes"; 

我收到错误“<em>对象引用未设置为对象的实例。” 这可以。

但是有了这个配置,我可以设置

TempData["test"] = "yes"; 

TempData["test"];在控制器中并在查看页面中打印。它运作良好。

根据MSDN “TempData 属性值存储在会话状态中”。

那么,如果我提到<sessionState mode="Off" />TempData 是如何工作的?ASP.NET 是否仍将 TempData 存储在会话或其他地方?

4

1 回答 1

17

仅当您在同一请求期间在视图上打印时,这才适用于禁用会话状态TempData["test"]- 因此此值已从 TempData 字典中删除,并且 MVC 不会尝试将其保存到会话状态。尝试将其从您的视图中删除,您将得到System.InvalidOperationException: The SessionStateTempDataProvider class requires session state to be enabled.

您可以通过添加属性或使用接口[SessionState(SessionStateBehavior.Disabled)]实现您自己的 TempData 提供程序来单独禁用控制器的会话状态。ITempDataProvider

[编辑] 只是为了解释我的第一点,让我们想象两种情况:

  • 您有控制器操作,它分配一些值,TempData["test"]以及从该操作返回并打印此数据的相应视图。在这种情况下,即使没有会话状态,一切都会正常工作,因为不需要TempData["test"]在请求之间进行存储。
  • 您有控制器操作,它分配一些值,TempData["test"]但将用户重定向到另一个操作,该操作具有自己的打印此数据的视图。在这种情况下,它不会在会话状态禁用的情况下工作,因为 MVC 需要TempData["test"]在两个请求之间存储您的值。
于 2012-05-27T09:15:49.910 回答