【问题标题】:Storing data in HttpContext.Current.Items vs ViewData在 HttpContext.Current.Items 与 ViewData 中存储数据
【发布时间】:2010-04-06 18:44:38
【问题描述】:

何时将数据存储在HttpContext.Current.Items[...] 与将数据存储在ViewData[...] 比较合适?

我正在尝试找出在此集合中存储数据的最佳做法,但我不确定将特定于用户的数据存储在 HttpContext.Current.Items 中是否安全。

一个用例是从基本控制器的OnActionExecuting(...) 传递用户信用以用于Controller 计算并在Views 中显示;我知道我应该为此使用ViewData,但是我在嵌套局部视图中得到了一些不一致的结果。

是否正确地说 HttpContext.Current.Items[...]Controllers 就像 ViewData[...]Views?

【问题讨论】:

    标签: asp.net-mvc httpcontext viewdata


    【解决方案1】:

    HttpContext.Current.Items 仅在请求期间持续,但对于该请求中的所有内容都是全局的。

    会话显然会持续整个用户会话,并在请求之间持续存在。

    您应该能够仅根据这些标准确定您需要使用哪一个。我不建议使用HttpContext.Current.Items,因为它往往是一种“全局变量”,而且往往会涉及到魔术键字符串,但有时你确实需要使用它。

    此外,虽然 .Items 和 ViewData 之间的比较非常恰当,但 .Items 与 ViewData 的行为方式不同,因为请求中涉及的每个 View(部分或其他)都有自己的 ViewData 副本。

    当您执行 RenderPartial 并尝试向 ViewData 添加一些内容时,行为差异很明显 - 当您返回父视图时,该项目不存在。

    【讨论】:

    • 很好的答案。我意识到我对 ViewData 比对 Session 更感兴趣,所以我编辑了我的问题。感谢您对 RenderPartial 的澄清。 HttpContext.Current.Items 会在重定向之间持续存在吗?
    • 否 - 重定向实际上会向浏览器返回 302 响应,然后浏览器会向服务器发出新请求。但是,如果您只是希望保留数据直到下一次重定向,您可能会考虑使用 TempData 字典。 blogs.teamb.com/craigstuntz/2009/01/23/37947
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2011-10-17
    • 2011-04-02
    • 2010-11-01
    • 2015-12-31
    相关资源
    最近更新 更多