私のMVCアプリケーションでは、投稿されたモデルが無効な場合、モデル状態をTempData
に保存して、別のアクションにリダイレクトするときに表示されるようにします。ここでSQLServerセッションモードのViewData(ModelState)をシリアル化する方法は?
は私がやったことです:
if (!ModelState.IsValid)
{
TempData["ViewData"] = ViewData;
return RedirectToAction("Edit", new { id = model.Id });
}
リダイレクトするには:
public ActionResult Edit(Guid id)
{
var model = Services.Get(id);
if (TempData["ViewData"] != null)
{
ViewData = (ViewDataDictionary)TempData["ViewData"];
}
ViewBag.HasUpdated = TempData["HasUpdated"];
return View(model);
}
これは、ローカルホストで正常に動作しますが、サーバー上で失敗しました。
エラーメッセージが語っている:
セッション状態をシリアル化することができませんが。 'StateServer'と 'SQLServer'モードでは、ASP.NETはセッション状態オブジェクトをシリアル化します。その結果、非直列化可能オブジェクトまたはMarshalByRefオブジェクトは許可されません。同様の逐次化がカスタムセッションステートストアによって「カスタム」モードで実行される場合、同じ制限が適用されます。
私たちのサーバーは、通常、モデルをセッションに保存するときに、モデルの冒頭に[Serializable]
を追加します。しかし、ViewData
で何ができますか? ViewDataDictionaryを弊社セッションに保存するには?
'ModelError'をこのシリアライズ可能な' ModelStateData'にマップすることをお勧めしますか? – Blaise
これは、あなたの問題の声明を見て、私の心の中で一番簡単な解決策です。あなたはもっと考えることができ、それをあなたの要求に合ったものにすることができます。セッション値からモデル状態を構築する場合は、複雑になることがあります。それを証明する例はありませんが、それができると思います。それは非常に一般的な方法では役に立たないかもしれませんが、モデルステートを格納して取り出すためには、それは確かに便利です。 –