1

私はMVC3Webアプリを持っています。その中で私はPRG(Post-Redirect-Get)パターンを使用してきました。これは、モデルの検証が失敗した場合のポストバック中に、ViewDataをTempDataに永続化してから、元のGETアクションにリダイレクトします。

アクション後-

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

後のGETアクション-

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

これはほとんど通常の方法です。これまで、すべてが正常に機能しています。ここで、セッションの永続性を改善する必要があります。つまり、「より長い」セッションが必要です。ASP.NetStateServerを使用すると結論付けました。

セッションをStateServerに移行した後-

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

カスタムオブジェクトを保存している一部のセッションで「シリアル化できません」というエラーが発生し始めました。問題を整理するようなオブジェクト[Serializable]を作成しました。しかし今、私は上記のPRGパターンで立ち往生しています!

エラー-アセンブリ'System.Web.Mvc、Version = 3.0.0.0、Culture = neutral、PublicKeyToken=31bf3856ad364e35'に「System.Web.Mvc.ViewDataDictionary」と入力してもシリアル化可能としてマークされていません。

奇妙なことに、私のシナリオを共有する単一のスレッドを見つけることができません。誰?

4

1 に答える 1

2

TempData がセッションに保存され、私のセッションが外部プロセスに保存されるという事実は、保存されるものはすべて「シリアル化可能」でなければならないことを要求します。

ViewDataDictionary や ModelStateDictionary などのオブジェクトは [シリアル化可能] ではありません。MVC PRG の場合、モデル状態エラーと無効なオブジェクトを渡すだけです。

私はすでにオブジェクトを [Serializable] としてマークしています (私は xml シリアライザーを使用して obj を「文字列化」し、それを保存しています - これは L2S エンティティであるため、循環参照も避ける必要があるためです)。参照SO 投稿

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

同様に、ModelState オブジェクト (エラーのみ) を「より単純な」オブジェクトに変換し、次のようなものに変換できます。

KeyValuePair<string,List<string>>[]

つまり、modelstate と modelObject を「シリアル化可能」にして、それらを TempData に入れて PRG パターンを保持できるようにしようとしています。

独自の TempData をデプロイし、TempData を Cookie に保存する方法は他にもいくつかありますが、複雑にしたくありません。誰かがこれに対するより良い解決策を持っているかどうか教えてください。

いくつかの参照 URL

于 2013-01-11T17:13:40.403 に答える