TempData实施更改 - 更改的原因

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在读取密钥之前删除密钥.所以是的,主要的好处是当你有多个重定向或交错请求时避免这些问题.此外,这些RedirectToRouteResultRedirectResult方法现在会自动调用TempData.Keep()以防止清除密钥,即使它们已经被读取,因此请记住这一点.

在不是这种情况的情况下,例如,如果想要在重定向到一个地方时读取TempData条目,并且期望在请求其他资源并导航回来时将其删除,则此更改会产生相当大的影响.

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

除此之外,我很想知道是否有内置的内容现在适合单个HTTP请求共享数据,其方式与TempData用于满足的方式相同?

我不知道任何复制TempData原始实现的新对象或函数.基本上我们仍然使用,TempData但必须注意数据持续到读取并在需要时手动清除字典.