TempData实施更改 - 更改的原因

时间:2013-02-15 09:36:25

标签: 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;
      }
    }

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用来满足的方式相同?

1 个答案:

答案 0 :(得分:6)

你是正确的TempData密钥只有在被阅读时(或在用户的会话到期后)才被清除,但是自MVC2以来就是这种情况,(http://forums.asp.net/post/3692286.aspx

  

我想更多地了解这种改变,这是什么改变   改变的原因,这只是为了迎合多重   重定向还是有更深层次的好处?

此更改可防止在MVC 1中出现的问题,例如TempData密钥在读取之前被删除。所以是的,主要的好处是当你有多个重定向或交错请求时避免这些问题。此外,RedirectToRouteResultRedirectResult方法现在会自动调用TempData.Keep()以防止清除密钥,即使在阅读完密钥后也是如此,所以请记住这一点。

  

在情况不是这样的情况下,例如想要阅读   TempData条目如果重定向到一个地方,并期望它有   如果请求其他资源并导航回去,则已删除   变化有很大影响。

你是对的,如果你在假设自动清除TempData键的情况下进行编码,你可能会遇到意想不到的问题。您可以致电TempData.Clear()手动删除TempDataDictionaryTempData.Remove(key)中的所有密钥以删除特定密钥。您还可以使用TempData.Peek()来读取TempData密钥的值,而不会将其标记为从TempDataDictionary中删除。

  

继发于此,我很想知道是否内置了任何东西   现在,它可以满足单个HTTP请求共享数据的需求   TempData用来满足的方式?

我不知道有任何复制TempData原始实现的新对象或函数。基本上我们仍然使用TempData但必须注意数据在读取之前一直存在并在需要时手动清除字典。