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


92

Добре, я слухав дискусію щодо "ViewModels" стосовно ASP.NET MVC MS.

Тепер це призначено для конкретного виду Моделі, правильно? Не специфічний вид подання.

Наскільки я розумію, це свого роду Модель, яка має конкретну мету взаємодії з Поглядом? Або щось подібне?

Буде вдячний за деякі роз’яснення.

Відповіді:


71

По суті Model і View Model - це прості класи з атрибутами.

Основна мета цих класів - описати ("Моделювати") об'єкт для відповідної аудиторії, яка є відповідно контролером та видом.

Отже, ви абсолютно праві, коли говорите

На моє розуміння, це свого роду Модель, яка має конкретну мету взаємодії з Поглядом

Отже, хоча класи класів - це фактично сутності домену, з якими взаємодіє ваша програма, моделі перегляду - це прості класи, з якими взаємодіють ваші подання.

Сподіваюся, це допоможе :)

Оновлення :

Корпорація Майкрософт розробила спеціалізовану версію презентаційного шаблону Мартіна Фаулера, в основному засновану на 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.
Dan Harris

@Lorenzo У своєму першому рядку ви говорите "обидва прості класи з атрибутами". Думаю, ви маєте на увазі властивості? Якщо ні, то до яких атрибутів ви мали на увазі? Атрибути проти властивостей
xr280xr

69

Найпростішими словами, мені подобається думати про наступне:

Модель: строго виглядає та відчуває себе як ваша модель даних. Для всіх намірів і цілей це лише представлення класу вашої моделі даних. Він не знає про ваш вигляд або будь-які елементи у ньому. Тим не менш, він не повинен містити жодних декораторів атрибутів (тобто; Обов’язковий, Довжина тощо), які ви використовували б для свого подання.

Модель перегляду: Слугує зв’язувачем даних між вашим видом та вашою моделлю, а в багатьох випадках також є обгорткою для вашої моделі. Він не став би марним без подання, тому він, як правило, не може бути повторно використаний у кількох представленнях та контролерах, як стандартна модель.

Як приклад, ваша модель може мати такі властивості, які є прямими зображеннями вашого джерела даних:

    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, модель стосується або (а) об'єктної моделі, яка представляє вміст реального стану (об'єктно-орієнтований підхід), або (b) рівня доступу до даних, що представляє цей вміст ( центричний підхід).

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

ViewModel : ViewModel - це „модель вигляду”, що означає, що це абстракція вигляду, яка також служить для прив’язки даних між видом і моделлю. Це можна розглядати як спеціалізований аспект того, що може бути контролером (за зразком MVC), який виконує функцію прив'язки / перетворювача даних, який змінює інформацію про модель на інформацію про перегляд і передає команди з перегляду у модель. ViewModel надає загальнодоступні властивості, команди та абстракції. ViewModel було порівняно з концептуальним станом даних на відміну від реального стану даних у Моделі.


3
Хоча є опис Model і ViewModel, це посилання просто описує архітектурний шаблон MVVM. Не різниця між моделями та моделями вигляду
Лоренцо

5

Існує поняття ViewModel, але воно, як правило, не асоціюється з Asp.net MVC. MVC використовує шаблон моделі View View Controller, де контролер обробляє взаємодії, збирає дані з моделі, а потім передає ці дані у View для відображення.

ViewModels (і модель View ViewModel) більш загально пов’язана з Silverlight та WPF. Xaml дещо відрізняється тим, що подання можуть робити двостороннє прив'язку до ViewModels, тому технологія трохи інша. Наприклад, якщо ви прив'язуєте текстове поле до поля під час введення тексту, значення поля динамічно оновлюється. Такого роду взаємодія насправді неможлива на веб-сторінках, оскільки веб-сторінки не мають громадянства.

Подібність двох моделей полягає в тому, що вони обидва намагаються відокремити логіку від дисплея. Найпоширенішим використанням / причиною цього є тестування: ви хочете мати можливість виконувати з коду (за допомогою тестової основи) всі взаємодії, які користувач буде викликати через Інтерфейс користувача.


У книзі, яку я читаю, "Професійний ASP MVC 2", ViewModel представлений у главі 1 як засіб збереження взаємодії презентації та моделі як сильно набраного, так і СУХОГО. До авторів Microsoft належать Скотт Хенслеман, Філ Хак, Скотт Гатрі.
Берріл,

Останнім часом я бачив набагато більше, що ViewModel використовується в Asp.net MVC. здається, що ViewModel переглядає більше бізнесу, ніж модель домену. Отже, шаблон, який ми використовували, полягає в тому, щоб моделі доменів збирали основні частини ViewModel. В даний час ми використовуємо модифікований шаблон команд (операцій), які працюють із моделями доменів для виконання своїх завдань. Результати збираються у ViewModel і надсилаються у подання. Модель перегляду в цьому випадку містить усі анотації та просту, сфокусовану логіку, яка підтримує вигляд.
Sinaesthetic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.