浏览器刷新后,Html.Deserialize丢失TempData

时间:2013-01-08 14:55:48

标签: asp.net html asp.net-mvc asp.net-mvc-3 asp.net-mvc-futures

我有一个ASP.NET MVC4向导。要从一步到另一步传递一个大视图模型,我使用期货装配。我用

序列化我的模型
@Html.Serialize("model", Model, SerializationMode.Signed); 

并在控制器中反序列化

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var serialized = Request.Form["model"];
    if (serialized != null)
    {
        model = (BausparViewModel)new MvcSerializer().Deserialize(serialized, SerializationMode.Signed);
        TryUpdateModel(model);
    }

...
}

我在

中设置了TempData
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.Result is RedirectToRouteResult)
        TempData["model"] = model;
}

每个向导步骤都有自己的视图,我使用RedirectToAction(“ActionName”)管理控制器中的上一个/下一个操作

一切正常,只要浏览器不使用F5或菜单进行刷新。在这一点上,控制器再次被调用。控制器已有模型,但TempData不会再次保存。

但缺少两个枚举属性。它们用于前面的步骤。他们通过RadiobuttonFor绑定了视图。

那么为什么有一个不完整的模型?

提前致谢 csteinmueller

1 个答案:

答案 0 :(得分:0)

对于任何超过1个请求的内容,您不应使用TempData。使用Session或其他一些长期存储机制。

TempData旨在从字典中读取后删除值。这就是TempDataDictionary包含PeekKeep等方法的原因。这些方法让你明确地告诉字典“嘿,在我读取它之后不要删除它”,因为默认情况下,它会在你读取之后删除它。