Полиморфное пользовательское связующее модели не заполняет модель значениями - PullRequest
1 голос
/ 11 ноября 2011

У меня есть пользовательский механизм связывания моделей, который я использую для возврата соответствующего подтипа модели на основе скрытого значения, содержащего исходный тип.

Например, на мой взгляд (EditorTemplate) у меня есть:

@model MyWebApp.Models.TruckModel
@Html.Hidden("ModelType", Model.GetType())
@Html.EditorFor(m => m.CabSize)

Затем, в моем пользовательском связывателе модели, у меня есть:

    protected override object CreateModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext, Type modelType)
    {
        var typeValue = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName + ".ModelType");

        var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true);

        var model = Activator.CreateInstance(type);

        bindingContext.ModelMetadata = ModelMetadataProviders.Current
            .GetMetadataForType(() => model, type);

        return model;
    }

Переменные typeValue и type устанавливаются на соответствующие значения (тип TruckModel), но после выполнения GetMetadataForType, model по-прежнему заполняется значениями null / default.

Я проверил несколько сообщений ( здесь и здесь , чтобы назвать пару), и кажется, что я делаю все, как описано здесь, но это все еще не работает для меня .

Подробнее о настройке вида / модели можно узнать, обратившись к моему предыдущему сообщению по этой теме.

1 Ответ

0 голосов
/ 15 ноября 2011

Как @sydneyos заявляет выше в комментариях, моя модель фактически заполнялась, но, очевидно, в методе CreateModel возвращаемая модель не будет содержать значений в этой точке.

В моем случае я получил ArgumentNullException по этому методу, который, как я думал, был из-за того, что модель не заполнялась. Но оказывается, что это не было связано, и как только это было исправлено, привязка модели работала как ожидалось.

...