2013-01-09 40 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等,但我不想讓事情複雜化。如果有人有更好的解決方案,請告訴我。

一些參考網址