Нарушает ли использование ViewModels и ссылок на System.Web.Mvc шаблон MVC?

#asp.net-mvc #model-view-controller #asp.net-mvc-2 #viewmodel

#asp.net-mvc #модель-представление-контроллер #asp.net-mvc-2 #viewmodel

Вопрос:

Я видел это повсюду в SO, блогах и книгах, где авторы советуют вам добавлять ViewModels, специфичные для вашего представления, в ваши проекты моделей в качестве оболочек для ваших базовых объектов модели. Идея состоит в том, чтобы сделать его очень простым и целенаправленным, когда вы собираетесь выполнить привязку модели к представлению. Вот хороший пример: Раскрывающиеся списки рендеринга и привязки с использованием ASP.NET Редактор MVC 2 для

Однако меня немного раздражает, что в моей модели теперь есть ссылки на System.Web.Mvc, которые в противном случае могли бы использоваться для нескольких выходов (возможно, WCF API, Silverlight и т.д.), Но теперь у меня есть конкретные ссылки на MVC dll, которые потребуются для сборки моего модельного проекта.

Мой вопрос: нарушает ли это шаблоны MVC, когда мы начинаем добавлять IEnumerable<SelectListItem> в наши классы моделей? И есть ли жизнеспособный альтернативный уровень для переноса этого и как, т. Е. Контроллер?

Приветствуются любые мысли или комментарии.

Комментарии:

1. взгляните на пример проекта mvc отсюда valueinjecter.codeplex.com , это делается без какой-либо логики в viewmodels

Ответ №1:

Я лично создаю список выбора «на лету» в представлении только из более удобного списка IEnumerable в моей модели, что означает, что в моей модели нет ничего, связанного с SelectLists, SelectListItems или чем-либо специфичным для MVC.

Пример, как и было обещано — создайте список выбора в представлении, используя все обычные биты механизма просмотра…

 <%= Html.ListBox("SelectedStuff", 
        new SelectList(Model.SomeOptions, "id", "name", Model.SelectedStuff)) %>
  

Комментарии:

1. мешает ли создание списков выбора «на лету» использованию типизированных представлений и их аналогов методом HtmlHelper?

2. Нет — вы просто создаете список выбора внутри представления… Я добавлю пример к своему ответу.

3. Для меня это выглядит просто уродливо 😉 Я всегда делаю IEnumerable<SelectListItem> для моей модели представления в контроллере (который также специфичен для MVC) и получаю более чистые представления.

4. @Necros — Требование к списку выбора касается только конкретного представления. Контроллер не должен заботиться о том, как будут отображаться эти данные. Если представление решит отобразить список гиперссылок на данные, или выпадающий список, или что-то еще, вам не нужно вносить изменения в свой контроллер. Ваше решение поместить IEnumerable<SelectListItem> в контроллер является хрупким.

Ответ №2:

нарушает ли это шаблоны MVC, когда мы начинаем добавлять IEnumerable в наши классы моделей?

Не совсем, но если вы пытаетесь использовать дизайн, управляемый доменом, или разделение задач между вашим бизнес-уровнем и уровнем MVC / представления, то это нарушение.

  • Модели — это ваши сущности, ваш домен, объекты вашего бизнес-уровня.

  • ViewModels — это ваши экраны, публикации форм, корзины отображаемых данных.

Модели сопоставляются с ViewModels, которые могут содержать элементы, зависящие от MVC. Подумайте, если это так, ViewModels предназначены непосредственно для MVC. Модели могут быть для сервиса, winform, WPF или любого программного представления системы business sytem.

Ответ №3:

Нет, ViewModels предназначены для использования представлением и должны быть расположены в вашем веб-проекте. Однако ваша фактическая модель не должна содержать ссылок на MVC или ваш веб-проект. Думайте о вашей ViewModel как о преодолении этого веб-разрыва между вашей моделью и вашим представлением.