【问题标题】:Using TempData while <sessionState mode="Off" />在 <sessionState mode="Off" /> 时使用 TempData
【发布时间】:2012-06-02 02:52:30
【问题描述】:

我试图减少一个站点的会话。所以将&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 存储在会话中或其他地方?

【问题讨论】:

    标签: asp.net asp.net-mvc session tempdata


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我了解 ITempDataProvider 并对此表示感谢。我还发现,您可以从这里将临时数据保存在 cookie 中,而不是 session。 afana.me/post/….
    • 是的,这家伙已经实现了他自己的基于 cookie 的 TempData 提供程序。
    • 我们将 TempData 用于单个请求,对吧?所以我们在控制器中设置 TempData 的值并进入查看页面。我对“尝试将其从您的视图中删除,您会得到错误”存有疑问。你能解释一下吗?
    • @JomyJohn 我认为如果您在同一个请求中读取它(由存储临时数据的控制器呈现的视图),您需要的不是 TempData。您可能想要使用 ViewData 或 ViewBag 集合。 TempData 主要用于存储将在不同请求中读取的数据,例如:如果您的控制器从请求 #1 执行 RedirectToAction() ......将 HTTP 302 响应发送回浏览器,然后重定向(请求 #2)到服务器。此时您的 ViewBag/ViewData 为空,但 TempData 仍将数据保存在 Session 中,直到您读取它。 AJAX 请求也是如此
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2022-12-27
    相关资源
    最近更新 更多