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

10

如果我重定向到一个新页面,通过TempData初始化该页面,它会正常工作,但是如果用户在浏览器中按下刷新按钮,TempData将不再可用。 鉴于这一点,是否有任何情况下TempData可以可靠使用?
或者有没有任何方法可以消除或减轻用户刷新的问题?

如果我传递TempData来初始化新页面并且重定向到该页面,它可以正常工作。但是,如果用户在浏览器中按下刷新按钮,TempData将不再可用。因此,目前似乎没有可靠地使用TempData的情况。这个问题可以通过使用其他技术(例如Session)或采取其他措施(例如避免重定向到需要使用TempData的页面)来缓解。
6个回答

25
你应该编写。
TempData.Keep("nameofthedata");

如果在控制器中保留数据,那么即使在刷新情况下也会保留这些数据。


13
在MVC1中,确实,在存储键之后的下一个请求后,临时数据会丢失。
但是在MVC2中,只要尝试访问它,临时数据就会丢失。
您始终可以使用TempData使用的Session来解决您遇到的临时数据丢失问题。
从MVC2 Beta Release Notes中:
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);
        }
    }

基于现在访问值?我错过了那个变更日志。 - Nathan Taylor
是的,你可以提供一下 TempData 在第一次访问尝试时丢失的参考资料吗? - Omar
@Nathan Taylor @Baddie,希望我的修改和引用解决了你们的顾虑。 - John Farrell
太好了。我不知道那个变化。 - Nathan Taylor

2
在MVC1中,针对这种情况的一个解决方法是在第二个控制器中重新分配TempData。当然,这会使数据在系统中保留更长的时间,但它可以解决刷新问题。

2
它应该在MVC2中工作。但是不确定其影响,因为如果不再读取,它可能会持续存在。 - ravi

1

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


0
唯一能解决您问题的功能是CacheSession
当视图生成时,ViewData本质上会“死亡”。
如果您可以提供更多关于您想要实现的细节,也许可以给出另一个解决方案,但似乎对您来说最好的选择是使用SessionCache

最终,我采用了完全不同的方法,并通过查询字符串传递数据(虽然只有几个变量,但仍不是最优雅的解决方案)。 - Myster

-1

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


3
关于使用ViewData进行数据持久化的声明是不正确的。ViewData的作用域在视图生成后结束。刷新操作只会重新运行动作并生成新的ViewData,没有任何数据被持久保存。 - Omar
也许我在解释时表达不够清晰。我的意思是通过刷新的方式将该值重新添加到ViewData中。 - Nathan Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接