2013-01-09 48 views
1

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

在后动作 -

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" /> 
... 

我开始对其中一些存储自定义对象我的会话“无法序列化”的错误。我已经做了这样的对象[可序列化]其中整理了问题。但现在我坚持使用上述PRG模式!

错误 - 类型 'System.Web.Mvc.ViewDataDictionary' 在大会 'System.Web.Mvc,版本= 3.0.0.0,文化=中立, 公钥= 31bf3856ad364e35' 未标记为可序列。

奇怪我无法找到共享我的方案的单个线程。任何人?

回答

2

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

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

我已经标记对象[序列化(我使用XML 串行到“字符串”我的OBJ,然后存储它 - 因为它是一个L2S 实体因此需要避免循环裁判以及)。参考SO Post

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

,我同样可以在我的ModelState对象(仅适用于错误)翻译成“简单”的对象,并将其转换成类似

KeyValuePair<string,List<string>>[] 

总之,我试图让我的modelstate和modelObject“可序列化”,以便我可以将它们放入TempData并保留PRG模式。

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

一些参考网址