4

抽象クラスを使用する単純な Poco-Model がありますが、Asp.net MVC 2 のデフォルトの ModelBinder では機能しないようです。1 つのアイテムには、コレクション内に複数のオブジェクトがあり、すべて同じ抽象基本クラスを使用しています。

モデル:

    public partial class Item
    {  
        public virtual ICollection<Core.Object> Objects
        {
            get
            {
                return _objects;
            }
            set
            {                
                    if (value != _objects)
                    {
                        _objects = value;
                    }
            }
        }
        private ICollection<Core.Object> _objects;
    }   


 public abstract partial class Object
    {

        public virtual Item Item
        {
            get
            {
                return _item;
            }
            set
            {
                if (!Object.ReferenceEquals(_item, value))
                {
                    _item = value;
                }
            }
        }
        private Item _item;       

    }

    public partial class TextObject : Object
    {
        public virtual string Text { get; set; }
    }

実例:

var NewItem = new Item();                    
var TextObject1 = new TextObject
{
   Text = "Text Object Text",
   Item = NewItem
};                      
List<Core.Object> objects = new List<Core.Object>(){TextObject1};            
NewItem.Objects = objects;

Objects コレクション内の 1 つの TextObject を使用して、そのアイテムに Default Html.EditorForModel() ヘルパーを使用すると、次のような html 入力フィールドが得られます。

<input class="text-box single-line" id="Objects_0__Text" name="Objects[0].Text" type="text" value="Text Object Text" />

コントローラーにポストバックすると、デフォルトの ModelBinder から「抽象クラスを作成できません」というエラー メッセージが表示されます。明らかに、バインダーはその抽象基本クラスをインスタンス化しようとします。しかし、コレクションには継承された TextObject タイプのオブジェクトしかないため、その理由はわかりません。カスタム Modelbinder を作成せずにこれを機能させる方法はありますか?

4

3 に答える 3

3

カスタムモデルバインダーを使用するか、ビューモデルを使用する必要があります。モデルバインダーは、アクションのパラメーターとして使用するタイプ(抽象クラ​​スを含む)についてのみ認識します。次に、リクエストからそのモデルに値をマッピングしようとします。バインダーが他の実装を使用する必要があることと、それがどのような実装であるかを知る方法はありません。

私のアドバイスは、より単純なビューモデルを作成し、 automapperを使用してそれらをマップすることです。

于 2010-03-05T13:50:31.640 に答える
2

Check out the DerivedTypeModelBinder in MvcContrib. The TypeStamping injects metadata into the view rendering, giving the derivedtypemodelbinder the information needed to make the proper call on what object to instantiate. A longer discussion with links to this

MVC2 Modelbinder for List of derived objects

于 2010-06-22T14:56:15.380 に答える
0

ItemクラスでObjectsコレクションをとして指定する必要があると思いますICollection<TextObject>。そうしないと、デフォルトのモデルバインダーが作成するオブジェクトを認識できなくなります。カスタムモデルバインダーを作成する場合は、オブジェクトごとに、そのタイプを示すフィールドをフォームに追加する必要があります。よろしく。

于 2010-03-05T13:53:30.653 に答える