0

私はモデルを持っています、そしてそれはこのように見えます:

public class MyModel {
   public List<SomeBaseClass> list {get; set;}
   public string SomeProperty {get; set;}
}

ここSomeBaseClassで、は実際には基本クラスであり、リストにはさまざまなタイプのアイテムを含めることができますが、これらのタイプはすべてから継承されSomeBaseClassます。

モデルが正しくバインドされるようにするには、フォームデータに基づいてモデルに入力するカスタムバインダーを実装する必要がありました。

public class MyModelBinder: DefaultModelBinder
{
   public override object BindModel(ControllerContext cntxt, ModelBindingContext bindingContext)
   {
        var model = new MyModel {
            list = new List<SomeBaseClass>(),
            SomeProperty = ...
        };

        ... // some data mangling and type twisting here

        return model; // here the debugger shows that the model's list is populated properly based on the form data.
    }
}

しかし、ビューがアクションを呼び出すとき、私のモデルは完全ではありません:

public string SomeAction(MyModel model) { // <~~ It calls the custom binder before coming to here, which is correct
   // As the result, the model variable is an instance of MyModel, but the list is null
   return "somethhing";
}

アクションメソッドでは、listプロパティがnullに設定されたモデルオブジェクトを受け取ります。これは奇妙なことです。バインダーが正しく呼び出され、モデルとそのすべてのプロパティが適切に読み込まれるためです。

何が間違っているのか理解できません。

PSアクションメソッドを呼び出そうとするとUpdateModel<MyModel>(model);、「タイプMyModelのモデルを更新できませんでした」というメッセージが表示されます。

4

1 に答える 1

0

はい、分かりました。モデルがアクションメソッドに渡されるときにバインダーが呼び出されるように、モデルクラス宣言の横にバインダー属性を追加する必要がありました。

[ModelBinder(typeof(MyModelBinder))]
public class MyModel
{
...
}

この属性が存在しない場合でもカスタムバインダーが呼び出されるため、明らかではありませんが、何らかの理由でその出力がアクションに送信されないため、代わりにデフォルトのバインダーの出力が使用されます。

于 2013-02-12T23:51:22.787 に答える