2011-11-10 4 views
1

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

Например, на мой взгляд (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 по-прежнему заполняется нулями/значениями по умолчанию.

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

Более подробную информацию о настройке вида/модели можно найти со ссылкой на мой previous post по этой теме.

+1

Я думаю, вы ожидали значения по умолчанию на этом этапе - только после вызовов GetPropertyValue, что на самом деле модель будет заполнена значениями из представления, вы прошли через этот метод? – sydneyos

+0

@sydneyos - Вы правы, значения не должны устанавливаться в этот момент. Я никогда не видел этого из-за исключения, которое было выбрано, прежде чем оно попало к моему контроллеру (несвязанное исключение «ArgumentNullException», но я думал, что это связано). Как только я исправил эту проблему, она попала к моему контроллеру, и, как вы сказали, моя модель была заселена в этот момент. Если вы можете опубликовать это как ответ, я соглашусь с ним. Благодарю. –

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^