Пользовательская привязка модели к производному свойству не работает - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть пользовательский 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 Ответ

7 голосов
/ 11 ноября 2011

Вам нужно будет связать подшивку модели с базовым классом:

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

Ваше действие POST принимает параметр InfoModel, который сам имеет свойство Vehicle типа VehicleModel.Таким образом, MVC не знает TruckModel во время процесса связывания.

Вы можете взглянуть на следующий пост примера реализации полиморфного связующего модели.

...