ASP.NET MVC做浏览器刷新使TempData无用吗?

时间:2010-04-15 01:02:11

标签: asp.net-mvc tempdata

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

6 个答案:

答案 0 :(得分:19)

你应该写

TempData.Keep("nameofthedata");

在您的控制器中,它也会将数据保存在刷新情况中。

答案 1 :(得分: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);
        }
    }

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

ViewData在生成视图时基本上“死掉”。

如果您可以提供有关您要完成的内容的更多详细信息,则可能会提供其他解决方案,但是,对您而言,最佳选择似乎是使用SessionCache。< / p>

答案 5 :(得分:-1)

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