Модель ASP.NET MVC против ViewModel

92

Хорошо, я слышал обсуждение "ViewModels" в отношении MS ASP.NET MVC.

Предполагается, что это особый вид Модели, верно? Не конкретный вид.

Насколько я понимаю, это своего рода модель, которая имеет конкретную цель взаимодействия с View? Или что-то типа того?

Были бы признательны за некоторые пояснения.

Qcom
источник

Ответы:

71

По сути, модель и модель представления - это простые классы с атрибутами.

Основная цель этих классов - описать («Модель») объект для соответствующих аудиторий, которые являются соответственно контроллером и представлением.

Итак, вы совершенно правы, когда говорите

Насколько я понимаю, это своего рода модель, которая имеет конкретную цель взаимодействия с представлением

Таким образом, в то время как классы модели фактически являются объектами домена, с которыми взаимодействует ваше приложение, модели представлений - это простые классы, с которыми взаимодействуют ваши представления.

Надеюсь, это поможет :)

Обновление :

Microsoft разработала специализированную версию шаблона презентации Мартином Фаулером, в значительной степени основанную на Model-View-Controller, и назвала ее Model-View-ViewModel (MVVM) для приложения PF. Этот шаблон нацелен на современные платформы разработки пользовательского интерфейса, где у разработчиков пользовательского интерфейса разные требования, основанные больше на бизнес-логике, чем у традиционных разработчиков. Посмотрите здесь немного теории

Лоренцо
источник
1
Хорошо, спасибо, а также спасибо за обновление, это очень полезно! Итак, не принимая во внимание специальную версию MS со стандартным MVC 2, помещаете ли вы ViewModels в специальную папку? Или они просто помещены прямо в папку Models, как и любые другие. Или вы можете сделать то же самое?
Qcom
Добро пожаловать. Обычно я помещаю модели и просматриваю модели в одной папке, потому что я хочу сгруппировать их вместе по предмету, к которому они относятся, но это только мой выбор, и я уверен, что есть лучшие,
Лоренцо
5
Предполагается, что ViewModel отделяет View от модели (домена). Поэтому имеет смысл разместить ViewModel рядом с View, а не рядом с Model.
Виталий Улантиков
Я бы сохранил свои классы Model вне моего проекта MVC, а не в папке Model - однако я бы сохранил классы View Model внутри проекта MVC, чтобы, как говорит Виталий, они были рядом с View.
Дэн Харрис
@Lorenzo В первой строке вы говорите «оба простых класса с атрибутами». Я думаю, вы имеете в виду недвижимость? Если нет, то какие атрибуты вы имели в виду? Атрибуты против свойств
xr280xr
69

Проще говоря, мне нравится думать о следующем:

Модель: строго похоже на вашу модель данных. Для всех намерений и целей это всего лишь классовое представление вашей модели данных. Ему ничего не известно о вашем представлении или каких-либо элементах в вашем представлении. Тем не менее, он не должен содержать никаких декораторов атрибутов (например, Required, Length и т. Д.), Которые вы бы использовали для своего представления.

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

Например, ваша Модель может иметь следующие свойства, которые являются прямым представлением вашего источника данных:

    public string FirstName { get; set; }
    public string LastName { get; set; }

Теперь, поскольку ваша модель представления привязана к вашему представлению, она может иметь следующее свойство, которое объединяет поля FirstName и LastName модели в одну строку:

    [Display(Name = "Customer Name")]                
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
Джейсон Марселл
источник
2
Не могли бы вы привести более полный пример ViewModel? Как он узнает, что такое myModel и как получает данные для myModel?
M Kenyon II
5
По своей природе ViewModel - это старый простой объект C # (POCO), который никогда не узнает, как выглядит ваша модель данных. Это скорее гибрид вашей модели данных и определенных элементов, которые необходимо отображать в вашем представлении. Что касается того, как он получает данные, вы должны загрузить его данными. Мне нравится использовать отдельный промежуточный класс, в котором я вызываю свой сервис для получения данных, а затем вручную загружаю эти данные в свою ViewModel. Затем я возвращаю полностью загруженную ViewModel действию контроллера.
Джейсон Марселл
26

Я нашел эту статью очень полезным ресурсом для понимания того, как «Модель предметной области» и «Модель представления» взаимодействуют в приложении MVC, особенно в отношении привязки. Лучше всего включать примеры вместо абстрактных описаний.

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

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

неверный
источник
19

В WikiPedia есть более полное описание Model vs. ModelView, чем вы получите в ответе SO: http://en.wikipedia.org/wiki/Model_View_ViewModel

Я цитирую:

Модель : как и в классическом шаблоне MVC, модель относится либо к (а) объектной модели, которая представляет реальное содержимое состояния (объектно-ориентированный подход), либо (б) к уровню доступа к данным, который представляет это содержимое (данные - центрический подход).

Представление : как и в классическом шаблоне MVC, представление относится ко всем элементам, отображаемым графическим интерфейсом пользователя, таким как кнопки, окна, графика и другие элементы управления.

ViewModel : ViewModel является «моделью представления», что означает, что это абстракция представления, которая также служит для привязки данных между представлением и моделью. Это можно рассматривать как специализированный аспект того, что могло бы быть Контроллером (в шаблоне MVC), который действует как связыватель / преобразователь данных, который изменяет информацию о модели в информацию о представлении и передает команды из представления в модель. ViewModel предоставляет общедоступные свойства, команды и абстракции. ViewModel можно сравнить с концептуальным состоянием данных, а не с реальным состоянием данных в модели.

Ян Мерсер
источник
3
Хотя есть описание Model и ViewModel, эта ссылка просто описывает архитектурный шаблон MVVM. Не разница между модельной и визуальной моделями
Лоренцо
5

Существует понятие ViewModel, но оно обычно не связано с Asp.net MVC. MVC использует шаблон контроллера представления модели, в котором контроллер обрабатывает взаимодействия, создает данные из модели, а затем передает эти данные в представление для отображения.

ViewModels (и шаблон ViewModel представления модели) в большей степени ассоциируется с Silverlight и WPF. Xaml немного отличается тем, что представления могут выполнять двустороннюю привязку к ViewModels, поэтому технология немного отличается. Например, если вы привязываете текстовое поле к полю, при вводе в это текстовое поле значение поля обновляется динамически. Такое взаимодействие невозможно на веб-страницах, поскольку веб-страницы не имеют состояния.

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

Цимон
источник
В книге «Professional ASP MVC 2», которую я читаю, ViewModel представлена ​​в главе 1 как средство сохранения взаимодействий между презентациями и моделями как строго типизированными, так и DRY. Среди авторов Microsoft Скотт Ханслеман, Фил Хаак, Скотт Гатри.
Беррил
В последнее время я видел намного больше, что ViewModel используется в Asp.net MVC. Казалось бы, ViewModel имеет большее значение в представлении, чем модель предметной области. Итак, шаблон, который мы использовали, состоит в том, чтобы модели предметной области собирали основные части ViewModel. В настоящее время мы используем измененный шаблон команд (операций), которые работают с моделями предметной области для выполнения своих задач. Результаты собираются в ViewModel и отправляются в представление. Модель представления в этом случае содержит все аннотации и простую, сфокусированную логику, поддерживающую представление.
Sinaesthetic