0

我有一个模型,它看起来像这样:

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

whereSomeBaseClass实际上是一个基类,列表可以包含不同类型的项目,但所有这些类型都继承自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";
}

在 action 方法中,我收到了list属性设置为null的模型对象。这很奇怪,因为绑定器被正确调用并且它正确地填充了模型及其所有属性。

我无法弄清楚我做错了什么。

PS当我尝试调用UpdateModel<MyModel>(model);action 方法时,它会抛出“无法更新 MyModel 类型的模型”。

4

1 回答 1

0

好,我知道了。我必须在模型类声明旁边添加 binder 属性,以确保在将模型传递给 action 方法时调用 binder。

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

这并不明显,因为即使此属性不存在,仍会调用自定义活页夹,但由于某种原因其输出未发送到操作,而是使用默认活页夹的输出。

于 2013-02-12T23:51:22.787 回答