【问题标题】:MVC PRG pattern conflict with SessionStateMVC PRG 模式与 SessionState 冲突
【发布时间】:2013-01-09 18:18:32
【问题描述】:

我有一个 MVC3 网络应用程序。我一直在使用 PRG (Post-Redirect-Get) 模式。那是在回发期间,如果任何模型验证失败我 persist the ViewData in TempData 然后重定向到原始 GET 操作。

在后期行动中 -

if (!ModelState.IsValid)
    TempData["ViewData"] = ViewData;

稍后在 GET 操作中 -

if (TempData["ViewData"] != null)
    ViewData = (ViewDataDictionary)TempData["ViewData"];

这几乎是通常的做法。到目前为止,一切都运行良好。 现在,我们需要改进会话持久性,即我们需要“更长”的会话。我已经决定使用ASP.Net State Server

在我将会话迁移到状态服务器之后 -

web.config - 
<system.web> ... 
<sessionState timeout="180" mode="StateServer" cookieless="UseCookies" />  
...

我的一些存储自定义对象的会话开始出现“无法序列化”错误。我制作了这样的对象 [Serializable] 来解决这个问题。但现在我被上面的 PRG 模式困住了!

错误 - 在程序集中输入“System.Web.Mvc.ViewDataDictionary” 'System.Web.Mvc,版本=3.0.0.0,文化=中性, PublicKeyToken=31bf3856ad364e35' 未标记为可序列化。

奇怪的是,我找不到一个可以分享我的场景的线程。有吗?

【问题讨论】:

    标签: asp.net-mvc-3 session viewdata tempdata stateserver


    【解决方案1】:

    TempData is stored in session 和我的会话又存储在外部进程中的事实要求存储的任何内容都必须是“可序列化的”。

    像 ViewDataDictionary 甚至 ModelStateDictionary 这样的对象不是 [Serializable]。对于 MVC PRG,我只需要传递模型状态错误和无效对象。

    我已经将对象标记为 [Serializable](我正在使用 xml 序列化程序“字符串化”我的 obj 然后存储它 - 因为它是 L2S 实体因此​​也需要避免循环引用)。参考SO Post

    TempDate["modelToPass"] = Serialization.Serialize<MyModel>(modelToPass);
    

    同样,我可以将我的 ModelState 对象(仅针对错误)转换为“更简单”的对象并将其转换为类似

    KeyValuePair<string,List<string>>[]
    

    简而言之,我正在尝试使我的模型状态和模型对象“可序列化”,以便我可以将它们放入 TempData 并保持 PRG 模式。

    还有一些其他方法可以部署我们自己的 TempData 并将 TempData 存储在 cookie 等中。但我不想让事情复杂化。如果有人对此有更好的解决方案,请告诉我。

    一些参考网址

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多