9

如果我重定向到传递 TempData 以初始化页面的新页面,它可以正常工作,但是如果用户在浏览器中按下刷新按钮,则 TempData 不再可用。鉴于此,是否存在可以可靠使用 TempData 的情况?
或者有什么方法可以消除或缓解用户刷新的问题?

4

6 回答 6

25

你应该写

TempData.Keep("nameofthedata");

在您的控制器中,那么它也会将该数据保持在刷新情况下。

于 2011-10-30T21:47:23.827 回答
13

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

但是,使用 MVC 2,临时数据在第一次尝试访问后会丢失。

您始终可以使用 TempData 无论如何都使用的 Session 来解决您遇到的临时数据丢失问题。

来自 MVC 2 Beta 发行说明:

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);
        }
    }
于 2010-04-15T01:08:50.327 回答
2

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

于 2010-04-21T04:36:13.657 回答
1

临时数据用于跨重定向,因此如果您正在刷新页面,这意味着您正在向服务器发出单独的请求,这就是您的数据丢失的原因。要保留此数据,请在您要重定向到的操作中调用 Tempdata.Keep("KeyofTempdata") 方法。如果要删除数据,请使用 Tempdata.Remove("KeyofTempdata")。

于 2013-02-14T09:15:05.943 回答
0

唯一可以解决您的问题的功能是CacheSession

ViewData当视图生成时,基本上“死”了。

如果您可以提供有关您要完成的工作的更多详细信息,也许可以提供另一种解决方案,但是,您似乎最好的选择是使用Sessionor Cache

于 2010-04-15T04:27:18.670 回答
-1

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

于 2010-04-15T01:09:33.713 回答