【问题标题】:Html.Deserialize loses TempData after browser refresh浏览器刷新后 Html.Deserialize 丢失 TempData
【发布时间】:2013-01-08 14:55:47
【问题描述】:

我有一个 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

【问题讨论】:

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


    【解决方案1】:

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

    TempData 旨在从字典中读出一个值后删除它。这就是为什么TempDataDictionary 有像PeekKeep 这样的方法。这些方法让您可以明确地告诉字典“嘿,在我阅读后不要删除此值”,因为默认情况下,它会在您阅读后删除该值。

    【讨论】:

    • 在这种情况下调用 Keep 方法有效。我读过的 mvc3 向导中的 howto 使用了 TempData。不是基于会话用户吗?因为一个用户可能会实例化多个向导。它是面向外部合作伙伴的咨询应用程序。
    • 是的,会话是每个用户的。但是,TempData 使用 Session 作为其底层数据存储(默认情况下),因此它也是每个用户的。如果您希望允许用户生成多个向导,则应在应用程序级别管理这些单独的向导(例如,将 Wizard[] 数组存储在 session 或 TempData 中,如果您选择继续使用它)。
    • 感谢您对 TempData 和 Session 的澄清。目前我懒得读入临时数据。它是由 mvc3 向导教程建议的。我将接受与临时数据或会话中的向导数组相结合的答案。我认为它会解决我的问题。
    猜你喜欢
    • 2019-03-24
    • 2011-02-01
    • 2022-09-30
    • 2021-06-28
    • 2012-03-26
    • 2023-04-04
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多