如果我重定向到传递 TempData 以初始化页面的新页面,它可以正常工作,但是如果用户在浏览器中按下刷新按钮,则 TempData 不再可用。鉴于此,是否存在可以可靠使用 TempData 的情况?
或者有什么方法可以消除或缓解用户刷新的问题?
6 回答
你应该写
TempData.Keep("nameofthedata");
在您的控制器中,那么它也会将该数据保持在刷新情况下。
在 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);
}
}
MVC1 中给定情况的解决方法是在第二个控制器中重新分配 TempData。当然,它将数据在系统中保留更多时间。但它解决了刷新问题。
临时数据用于跨重定向,因此如果您正在刷新页面,这意味着您正在向服务器发出单独的请求,这就是您的数据丢失的原因。要保留此数据,请在您要重定向到的操作中调用 Tempdata.Keep("KeyofTempdata") 方法。如果要删除数据,请使用 Tempdata.Remove("KeyofTempdata")。
唯一可以解决您的问题的功能是Cache
和Session
。
ViewData
当视图生成时,基本上“死”了。
如果您可以提供有关您要完成的工作的更多详细信息,也许可以提供另一种解决方案,但是,您似乎最好的选择是使用Session
or Cache
。
TempData 专门用于存储仅用于一页加载/操作/重定向的数据。如果您需要在刷新后保留数据,则应将其放在 ViewData 集合中,只要提供刷新请求的操作与最初请求的操作相同(即在重定向之前未添加 ViewData 值) .