1

我有一个 MVC3 网络应用程序。我一直在使用PRG(Post-Redirect-Get)模式。那是在回发期间,如果任何模型验证失败,我将 ViewData 保存在 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,版本=3.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”中的类型“System.Web.Mvc.ViewDataDictionary”未标记为可序列化。

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

4

1 回答 1

2

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

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

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

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

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

KeyValuePair<string,List<string>>[]

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

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

一些参考网址

于 2013-01-11T17:13:40.403 回答