MVC2 Modelbinder для списка производных объектов - PullRequest
3 голосов
/ 10 марта 2010

Мне нужен список различных (производных) типов объектов, работающих с привязкой по умолчанию для модели в Asp.net MVC 2.

У меня есть следующая модель представления:

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, все get красиво создается в форме, но связыватель моделей не разрешает мне свойства производного типа объекта при отправке обратно в ActionResult.

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

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

1 Ответ

4 голосов
/ 29 марта 2010

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

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

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

...