MVC2 Modelbinder для списка производных объектов
-
19-09-2019 - |
Вопрос
Мне нужен список различных (производных) типов объектов, работающих с Modelbinder по умолчанию в Asp.net MVC 2.
У меня есть следующая ViewModel:
public class ItemFormModel
{
[Required(ErrorMessage = "Required Field")]
public string Name { get; set; }
public string Description { get; set; }
[ScaffoldColumn(true)]
//public List<Core.Object> Objects { get; set; }
public ArrayList Objects { get; set; }
}
И список содержит объекты разных производных типов, например.
public class TextObject : Core.Object
{
public string Text { get; set; }
}
public class BoolObject : Core.Object
{
public bool Value { get; set; }
}
Неважно, использую ли я реализацию List или ArrayList, все прекрасно формируется в форме, но связыватель моделей не разрешает для меня свойства производного типа объекта при отправке обратно в ActionResult.
Что может быть хорошим решением для структуры Viewmodel, позволяющей обрабатывать список различных типов объектов?Наличие дополнительного списка для каждого типа объекта (например,List, List и т. д.), похоже, не является для меня хорошим решением, поскольку это требует больших накладных расходов как при построении модели представления, так и при сопоставлении ее обратно с моделью предметной области.
Размышляя о другом подходе к привязке всех свойств в пользовательской привязке модели, как я могу использовать здесь подход к аннотациям данных (проверка необходимых атрибутов и т. д.) без больших накладных расходов?
Решение
Проверьте Производный тип ModelBinder в MvcContrib.Это позволяет вам привязывать модели к производным типам посредством процесса «штамповки типов», который обрабатывается автоматически при использовании помощника RenderTypedPartial(...).Частичные элементы MvcContrib поддерживают состояние привязки между частичными элементами, поэтому префиксы имени/идентификатора правильно поддерживаются в графе глубоких объектов.Если вы используете другие механизмы, такие как шаблоны, вам придется самостоятельно обрабатывать штампы типов.Это объясняется на странице документации.
Возвращаясь к вашим вопросам и тому, как производные типы разрешаются с помощью ModelBinder, вы можете зарегистрировать варианты производного типа с атрибутами в механизме, аналогичном WCF KnownTypeAttribute, или выполнить регистрацию при запуске.В любом случае эти изменения регистрируются один раз и сохраняются из соображений производительности.
Связующее устройство модели также решает эту проблему таким образом, чтобы не влиять на атрибуты аннотации/проверки данных.Они будут работать так, как вы ожидаете от них в любом другом сценарии.