在HttpContext.Current.Items和ViewData中存储数据的区别

14
何时适合将数据存储在HttpContext.Current.Items[...]中,而不是存储在ViewData[...]中?
我正在尝试找出在此集合中存储数据的最佳做法,我不确定是否安全将特定于用户的数据存储在HttpContext.Current.Items中。
一个用例是从基本控制器的OnActionExecuting(...)传递用户信用额度,以便在Controller计算和Views中显示; 我知道我应该使用 ViewData,但我在嵌套部分视图中有一些不一致的结果。
可以这样说HttpContext.Current.Items[...]对于Controllers就像ViewData[...]对于Views吗?
1个回答

22

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

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

你应该能够根据这些标准确定应该使用哪一个。我不建议使用HttpContext.Current.Items,因为它往往是一种"全局变量",而且通常涉及神秘的关键字符串,但有时确实需要使用它。

此外,虽然你对.Items和ViewData之间进行比较非常恰当,但是.Items与ViewData行为不同,因为请求中涉及的每个视图(无论是部分视图还是其他)都会得到自己的ViewData副本。

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


很棒的答案。我意识到我对ViewData比Session更感兴趣,所以我相应地编辑了我的问题。感谢您对RenderPartial的澄清。HttpContext.Current.Items在重定向之间会保留吗? - Petrus Theron
1
不 - 重定向实际上会向浏览器返回302响应,然后浏览器再向服务器发出新请求。但是,如果您只想将数据保留到下一次重定向,可以考虑使用TempData字典。http://blogs.teamb.com/craigstuntz/2009/01/23/37947/ - womp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接