3

Asp.net MVC 2の既定のModelbinderで動作するさまざまな(派生した)オブジェクトタイプのリストが必要です。

私は次のViewModelを持っています:

public class ItemFormModel
    {       
        [Required(ErrorMessage = "Required Field")] 
        public string Name { get; set; }
        public string Description { get; set; }

        [ScaffoldColumn(true)]
        //public List<Core.Object> Objects { get; set; }       
        public ArrayList Objects { get; set; }                  
    }

また、リストには、さまざまな派生型のオブジェクトが含まれています。

public class TextObject : Core.Object
    {
        public string Text { get; set; }
    }

    public class BoolObject : Core.Object
    {
        public bool Value { get; set; }
    }

List実装とArrayList実装のどちらを使用するかは関係ありません。すべてがフォームで適切にスキャフォールディングされますが、Modelbinderは、ActionResultにポストバックするときに、派生オブジェクトタイプのプロパティを解決しません。

処理されるさまざまなオブジェクトタイプのリストを取得するためのViewmodel構造の良い解決策は何でしょうか?すべてのオブジェクトタイプ(リスト、リストなど)に追加のリストを用意することは、ビューモデルの構築とドメインモデルへのマッピングの両方で多くのオーバーヘッドが発生するため、私にとっては良い解決策ではないようです。

カスタムモデルバインダーですべてのプロパティをバインドする他のアプローチについて考えると、ここでデータ注釈アプローチ(必要な属性の検証など)を多くのオーバーヘッドなしで使用するにはどうすればよいですか?

4

1 に答える 1

4

MvcContrib の派生型 ModelBinder を確認してください。これにより、RenderTypedPartial(...) ヘルパーを使用するときに自動的に処理される「型スタンプ」のプロセスを通じて、派生型にモデル バインドできます。MvcContrib パーシャルはパーシャル間でバインド状態を維持するため、名前/ID プレフィックスは深いオブジェクト グラフで適切に維持されます。テンプレートなどの他のメカニズムを使用する場合は、型スタンプを自分で処理する必要があります。これはドキュメントページで説明されています。

質問に戻り、派生型が ModelBinder でどのように解決されるかについて説明します。WCF の KnownTypeAttribute と同様のメカニズムで派生型のバリエーションを属性に登録するか、起動時に登録を行うことができます。どちらの方法でも、これらのバリエーションは一度登録され、パフォーマンスを考慮して保持されます。

モデル バインダーは、データの注釈/検証属性に干渉しない方法でこの問題も解決します。他のシナリオでは期待どおりに機能します。

于 2010-03-29T19:42:43.143 に答える