派生属性上的自定义模型绑定不起作用

时间:2011-11-10 20:00:22

标签: c# asp.net-mvc asp.net-mvc-3 model-binding

我有一个自定义的ModelBinder(MVC3),由于某种原因没有被解雇。以下是相关的代码:

查看

@model WebApp.Models.InfoModel
@using Html.BeginForm()
{
    @Html.EditorFor(m => m.Truck)
}

EditorTemplate

@model WebApp.Models.TruckModel
@Html.EditorFor(m => m.CabSize)

ModelBinder的

public class TruckModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        throw new NotImplementedException();
    }
}

Global.asax中

protected void Application_Start()
{
    ...
    ModelBinders.Binders.Add(typeof(TruckModel), new TruckModelBinder());
    ...
}

InfoModel

public class InfoModel
{
    public VehicleModel Vehicle { get; set; }
}

VehicleModel

public class VehicleModel
{
    public string Color { get; set; }
    public int NumberOfWheels { get; set; }
}

TruckModel

public class TruckModel : VehicleModel
{
    public int CabSize { get; set; }
}

控制器

public ActionResult Index(InfoModel model)
{
    // model.Vehicle is *not* of type TruckModel!
}

为什么我的自定义ModelBinder无法启动?

1 个答案:

答案 0 :(得分:7)

您必须将模型绑定器与基类关联:

ModelBinders.Binders.Add(typeof(VehicleModel), new TruckModelBinder());

您的POST操作采用InfoModel参数,该参数本身具有VehicleModel类型的Vehicle属性。因此,MVC在绑定过程中不了解TruckModel。

您可以查看实现多态模型绑定器的示例的following post