6

既存のMVC3アプリをInProcからASP.NetSessionStateサービスに移動しています。モデルオブジェクトの1つに次のプロパティがあります。

public List<System.Web.Mvc.SelectListItem> StateCodes { get; set; }

そしてそれはこのエラーを投げています

セッション状態をシリアル化できません。「StateServer」および「SQLServer」モードでは、ASP.NETはセッション状態オブジェクトをシリアル化します。その結果、シリアル化できないオブジェクトまたはMarshalByRefオブジェクトは許可されません。「カスタム」モードのカスタムセッション状態ストアによって同様のシリアル化が行われる場合も、同じ制限が適用されます。

シリアル化する方法はありList<SelectListItem>ますか?

4

3 に答える 3

5

代わりに、Razorコードで選択リストアイテムを作成してみてくださいSelectList。代わりに、モデルに、SelectListが基づいている基になるデータのプロパティを持たせます。またはSelectListに配置しようとすることもできます。これも問題を解決する可能性があります。ViewBagViewData

ビューモデルにを保存SelectListすることは悪い習慣と見なされます。

于 2012-08-27T16:24:12.097 に答える
3

[上記の答えにいくつかの情報を追加するだけです]私はそれを信じています

SelectListをビューモデルに保存することは悪い習慣と見なされます。

これは、情報が最終ユーザーにどのように表示されるかについて、ビューモデルをそのような特定の方法で構築するべきではないという事実によるものです。

ビューモデルにアイテムのリストがあり、ビューがSelectListをレンダリングする場合は、もちろん問題ありません。ただし、ビューは、他の多くの方法でそのデータを最終ユーザーに提示することを選択できます。

于 2015-02-10T12:36:12.573 に答える
2

Bad practice aside, if converting to a different sesssion storage system and your code is littered with these and changing them out is not conducive to your timeframe, you can get by by marking your class as [Serializable] and then changing all your members that are list of selectlist items to the following:

namespace blah.blah.blah
[Serializable]
public class Blah : FromBlah

[NonSerialized]
private List<SelectListItem> _mySelectList;
public List<SelectListItem> MySelectList
{
    get { return _mySelectList; }
    set { _mySelectList= value; }
}

Also, adding the following terms for searchability for any people out there who got this issue after adding RedisSessionProvider, Redis, RedisSession, etc. You're welcome.

于 2018-07-11T14:03:20.280 に答える