在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;
}
}
和
public bool TryGetValue(string key, out object value)
{
this._initialKeys.Remove(key);
return this._data.TryGetValue(key, out value);
}
MVC 2:
public object this[string key] {
get {
object value;
if (TryGetValue(key, out value)) {
return value;
}
return null;
}
和
public bool TryGetValue(string key, out object value) {
return _data.TryGetValue(key, out value);
}
由于大多数人似乎在一个请求中将项目放在TempData
集合中并立即在下一个请求中将其读回来,因此功能似乎完全相同。
在不是这种情况的情况下,例如,如果要重定向到一个地方,想要读取TempData
条目,并且期望在请求其他资源并导航回来时将其删除,则此更改会产生相当大的影响
该条目不再适用于一个http请求,但可以通过许多HTTP请求使用,只有一个单词获取字典即可使用。
我想更多地了解这种改变,改变的原因是什么,这只是为了迎合多重重定向还是有更深层次的好处?
那是次要的,我很想知道是否有内置的内容现在适合单个HTTP请求共享数据,其方式与TempData
用来满足的方式相同?
答案 0 :(得分: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
但必须注意数据在读取之前一直存在并在需要时手动清除字典。