Asp.net mvc ASP.NET MVC浏览器刷新是否会使TempData无效?

Asp.net mvc ASP.NET MVC浏览器刷新是否会使TempData无效?,asp.net-mvc,tempdata,Asp.net Mvc,Tempdata,如果我重定向到一个新页面,并传递TempData来初始化该页面,它工作正常,但是如果用户按下浏览器中的刷新按钮,TempData将不再可用。 鉴于此,是否存在可以可靠使用TempData的情况? 或者有什么方法可以消除或缓解用户刷新的问题?在MVC 1中,是的,在存储密钥后的下一个请求后,临时数据会丢失 然而,对于MVC 2,在第一次尝试访问临时数据后,临时数据将丢失 您可以始终使用会话(TempData始终使用该会话)来解决您的临时数据丢失问题 来自MVC 2测试版发行说明: TempData

如果我重定向到一个新页面,并传递TempData来初始化该页面,它工作正常,但是如果用户按下浏览器中的刷新按钮,TempData将不再可用。 鉴于此,是否存在可以可靠使用TempData的情况?

或者有什么方法可以消除或缓解用户刷新的问题?

在MVC 1中,是的,在存储密钥后的下一个请求后,临时数据会丢失

然而,对于MVC 2,在第一次尝试访问临时数据后,临时数据将丢失

您可以始终使用会话(TempData始终使用该会话)来解决您的临时数据丢失问题

来自MVC 2测试版发行说明:

TempDataDictionary改进

TempDataDictionary的行为 类已稍微更改为 解决临时数据丢失的情况 过早移除或 持续的时间超过了必要的时间。对于 例如,在使用临时数据的情况下 读入与其相同的请求 已设置,临时数据正在持久化 对于下一个请求,即使 目的是把它移走。换句话说 在这些情况下,临时数据未持久化 跨多个连续重定向

为了解决这些情况 TempDataDictionary类已更改 这样所有的钥匙都能保存下来 直到读取密钥为止 从TempDataDictionary对象。 将Keep方法添加到 TempDataDictionary让您指示 不应删除该值 看完之后。这个 RedirectToActionResult就是一个例子 在其中调用Keep方法 为了保留所有的钥匙 下一个请求

您还可以直接在MVC 2源代码中查看这些更改:

MVC 1:

  public object this[string key] {
        get {
            object value;
            if (TryGetValue(key, out value)) {
                return value;
            }
            return null;
        }
        set {
            _data[key] = value;
            _modifiedKeys.Add(key);
        }
    }
MVC 2:

   public object this[string key] {
        get {
            object value;
            if (TryGetValue(key, out value)) {
                _initialKeys.Remove(key);
                return value;
            }
            return null;
        }
        set {
            _data[key] = value;
            _initialKeys.Add(key);
        }
    }

TempData专门用于存储一个页面加载/操作/重定向的数据。如果刷新后需要数据保持不变,则应将其放置在ViewData集合中,只要为刷新请求提供服务的操作与最初请求的操作相同(即,在重定向之前未添加ViewData值).

唯一可以解决您的问题的功能是
缓存
会话

ViewData
在生成视图时基本上“消失”


如果您可以提供更多关于您试图完成的任务的详细信息,也许可以提供另一种解决方案,但是,似乎您的最佳选择是使用
会话
缓存

MVC1中给定情况的解决方法是在第二个控制器中重新分配TempData。当然,它会将数据在系统中保留更长的时间。但它解决了刷新问题。

您应该编写

TempData.Keep("nameofthedata");

在您的控制器中,它也会将数据保持在刷新状态

Tempdata在重定向中使用,因此,如果您刷新页面,这意味着您正在向服务器发出单独的请求,这就是数据丢失的原因。要持久化此数据,请在重定向到的操作中调用Tempdata.Keep(“KeyofTempdata”)方法。如果要删除数据,请使用Tempdata.remove(“KeyofTempdata”)。

这是基于现在访问值吗?我错过了那个变更日志。是的,你能为第一次尝试访问时丢失的临时数据提供参考吗?@Nathan Taylor@Baddie,希望我的编辑和引用能消除你的顾虑。太好了。不知道该更改。您关于使用ViewData进行数据持久化的声明不正确。ViewData的作用域在生成视图时结束。刷新只需重新运行操作并重新生成ViewData,就不会有任何问题持续存在。也许我的解释模糊了我的意思。我的意思是,该值将通过刷新的方式重新添加到ViewData中。最后,我采用了一种完全不同的方法,将数据传递到查询字符串上(这只是几个变量,但仍然不是最优雅的解决方案),它也应该在MVC2中工作。但不确定其含义,因为如果不重新阅读,它可能会无限期地持续下去。