MVC2 Modelbinder для списка производных объектов

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

Что может быть хорошим решением для структуры Viewmodel, чтобы получить список обрабатываемых объектов различных типов? Наличие дополнительного списка для каждого типа объекта (например, List, List и т. Д.) Кажется мне не лучшим решением, поскольку это большие накладные расходы как при построении модели представления, так и при сопоставлении ее с моделью предметной области.

Если подумать о другом подходе привязки всех свойств в настраиваемом связывателе модели, как я могу использовать здесь подход аннотаций данных (проверка требуемых атрибутов и т. Д.) Без больших накладных расходов?


person user250773    schedule 10.03.2010    source источник


Ответы (1)


Ознакомьтесь с ModelBinder производного типа в MvcContrib. Это позволяет вам выполнять привязку модели к производным типам с помощью процесса «штамповки типов», который выполняется автоматически при использовании помощника RenderTypedPartial (...). Партиалы MvcContrib поддерживают состояние привязки между частями, поэтому префиксы Name / Id должным образом поддерживаются на глубоком графе объекта. Если вы используете другие механизмы, такие как шаблоны, вам придется самостоятельно обрабатывать штамповки. Это объясняется на странице документации.

Возвращаясь к вашим вопросам и способам разрешения производных типов с помощью ModelBinder, вы можете зарегистрировать вариации производных типов с атрибутами в механизме, аналогичном WCF KnownTypeAttribute, или вы можете выполнить регистрацию при запуске. В любом случае эти изменения регистрируются один раз и сохраняются для оценки производительности.

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

person S. Hebert    schedule 29.03.2010
comment
В настоящее время недоступно для MVC 4+ - person Paul Taylor; 15.05.2013