Вопрос

Мне нужен список различных (производных) типов объектов, работающих с 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, или выполнить регистрацию при запуске.В любом случае эти изменения регистрируются один раз и сохраняются из соображений производительности.

Связующее устройство модели также решает эту проблему таким образом, чтобы не влиять на атрибуты аннотации/проверки данных.Они будут работать так, как вы ожидаете от них в любом другом сценарии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top