Jam*_*xon 10 asp.net asp.net-mvc asp.net-mvc-2 asp.net-mvc-4
在ASP.NET MVC 2中,条目的生命周期TempDataDictionary只是一个HTTP请求.
这转化为在一个请求中设置值,重定向,并且可以访问该行另一端的相同项目.在此之后,无论您是否从行的后端读取字典中的值,该条目将不再可用.
自从ASP.NET MVC 3(我相信)以来,这个实现细节发生了很大的变化.
TempDataDictionary现在只有在阅读后才会删除条目.
MVC 4
public object this[string key]
{
get
{
object obj;
if (!this.TryGetValue(key, out obj))
return (object) null;
this._initialKeys.Remove(key);
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
和
public bool TryGetValue(string key, out object value)
{
this._initialKeys.Remove(key);
return this._data.TryGetValue(key, out value);
}
Run Code Online (Sandbox Code Playgroud)
MVC 2:
public object this[string key] {
get {
object value;
if (TryGetValue(key, out value)) {
return value;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
和
public bool TryGetValue(string key, out object value) {
return _data.TryGetValue(key, out value);
}
Run Code Online (Sandbox Code Playgroud)
由于大多数人似乎TempData在一个请求中将项目放入集合中并立即在下一个请求中将其读回,因此功能似乎完全相同.
在不是这种情况的情况下,例如,TempData如果要重定向到一个地方想要读取条目,并且在请求其他资源并导航回来时期望它已被删除,则此更改会产生相当大的影响.
该条目不再可用于一个http请求,但可以通过许多HTTP请求获得,只能在字典上单个获取.
我想更多地了解这种改变,改变的原因是什么,这只是为了迎合多重重定向还是有更深层次的好处?
除此之外,我很想知道是否有内置的内容现在适合单个HTTP请求共享数据,其方式与TempData以前相同?
小智 6
你是正确的,TempData只有在他们被阅读之后(或在用户的会话到期之后)才清除密钥,但是自MVC2以来就是这种情况,(http://forums.asp.net/post/3692286.aspx)
我想更多地了解这种改变,改变的原因是什么,这只是为了迎合多重重定向还是有更深层次的好处?
此更改可防止在MVC 1中出现的问题,例如TempData在读取密钥之前删除密钥.所以是的,主要的好处是当你有多个重定向或交错请求时避免这些问题.此外,这些RedirectToRouteResult或RedirectResult方法现在会自动调用TempData.Keep()以防止清除密钥,即使它们已经被读取,因此请记住这一点.
在不是这种情况的情况下,例如,如果想要在重定向到一个地方时读取TempData条目,并且期望在请求其他资源并导航回来时将其删除,则此更改会产生相当大的影响.
你是对的,如果你在假设TempData钥匙被自动清除的情况下进行编码,你可能会遇到意想不到的问题.您可以调用TempData.Clear()手动删除所有密钥TempDataDictionary,或TempData.Remove(key)删除特定密钥.您还可以使用TempData.Peek()读取TempData键的值而不标记它以从中删除TempDataDictionary.
除此之外,我很想知道是否有内置的内容现在适合单个HTTP请求共享数据,其方式与TempData用于满足的方式相同?
我不知道任何复制TempData原始实现的新对象或函数.基本上我们仍然使用,TempData但必须注意数据持续到读取并在需要时手动清除字典.
| 归档时间: |
|
| 查看次数: |
4760 次 |
| 最近记录: |