Я новичок в ASP.NET MVC. У меня проблема с пониманием цели ViewModel.
Что такое ViewModel и зачем нам ViewModel для приложения ASP.NET MVC?
Если бы я получил хороший пример о его работе и объяснениях, это было бы лучше.
asp.net-mvc
viewmodel
уникальный
источник
источник
Ответы:
A
view model
представляет данные, которые вы хотите отобразить на вашем представлении / странице, независимо от того, будут ли они использоваться для статического текста или для входных значений (таких как текстовые поля и раскрывающиеся списки), которые могут быть добавлены в базу данных (или отредактированы). Это нечто отличное от твоегоdomain model
. Это модель для представления.Допустим, у вас есть
Employee
класс, который представляет модель домена вашего сотрудника, и он содержит следующие свойства (уникальный идентификатор, имя, фамилия и дата создания):Модели представлений отличаются от моделей доменов тем, что модели представлений содержат только те данные (представленные свойствами), которые вы хотите использовать в своем представлении. Например, предположим, что вы хотите добавить новую запись сотрудника, ваша модель представления может выглядеть следующим образом:
Как видите, он содержит только два свойства. Эти два свойства также находятся в модели домена сотрудника. Почему это вы можете спросить?
Id
не может быть установлен из представления, он может быть автоматически сгенерирован таблицей Employee. ИDateCreated
может также быть установлен в хранимой процедуре или на уровне обслуживания вашего приложения. ТакId
иDateCreated
не нужны в представлении модели. Возможно, вы захотите отобразить эти два свойства при просмотре сведений о сотруднике (сотрудник, который уже был захвачен) в виде статического текста.При загрузке представления / страницы метод create action в контроллере сотрудника создаст экземпляр этой модели представления, заполнит все поля, если это необходимо, а затем передаст эту модель представления представлению / странице:
Ваш вид / страница может выглядеть следующим образом (при условии, что вы используете
ASP.NET MVC
иRazor
механизм просмотра):Валидация, таким образом, будет проводиться только на
FirstName
иLastName
. Используя FluentValidation, вы можете иметь такую проверку:А с аннотациями данных это может выглядеть так:
Важно помнить, что модель представления представляет только те данные, которые вы хотите использовать , и ничего больше. Вы можете представить весь ненужный код и проверку, если у вас есть модель домена с 30 свойствами, и вы хотите обновить только одно значение. При таком сценарии у вас будет только одно значение / свойство в модели представления, а не все свойства, которые находятся в объекте домена.
Модель представления может иметь не только данные из одной таблицы базы данных. Он может объединять данные из другой таблицы. Возьмите мой пример выше о добавлении новой записи сотрудника. Помимо добавления только имени и фамилии, вы также можете добавить отдел сотрудника. Этот список отделов придет с вашего
Departments
стола. Так что теперь у вас есть данные отEmployees
иDepartments
таблиц в одной модели представления . Затем вам нужно будет добавить следующие два свойства в вашу модель представления и заполнить ее данными:При редактировании данных сотрудника (сотрудника, который уже был добавлен в базу данных), он не сильно отличается от моего примера выше. Создайте модель представления, назовите это например
EditEmployeeViewModel
. Имеются только данные, которые вы хотите редактировать в этой модели представления, такие как имя и фамилия. Отредактируйте данные и нажмите кнопку отправки. Я не слишком беспокоюсь оId
поле, потому чтоId
значение, вероятно, будет в URL, например:Возьмите это
Id
и передайте на свой уровень хранилища вместе с вашими именами и фамилиями.При удалении записи я обычно иду по тому же пути, что и в модели редактирования. У меня также был бы URL, например:
Когда представление загружается в первый раз, я получаю данные сотрудника из базы данных, используя
Id
3. Я затем просто отображаю статический текст на моем представлении / странице, чтобы пользователь мог видеть, какого сотрудника удаляют. Когда пользователь нажимает кнопку «Удалить», я просто используюId
значение 3 и передаю его слою своего хранилища. Вам нужно толькоId
удалить запись из таблицы.Еще один момент: вам не нужна модель представления для каждого действия. Если это простые данные, то было бы хорошо использовать только
EmployeeViewModel
. Если это сложные представления / страницы, и они отличаются друг от друга, то я бы предложил вам использовать отдельные модели представлений для каждого.Я надеюсь, что это прояснит любую вашу путаницу с моделями представления и моделями доменов.
источник
Модель представления - это класс, который представляет модель данных, используемую в конкретном представлении. Мы могли бы использовать этот класс в качестве модели для страницы входа в систему:
Используя эту модель представления, вы можете определить представление (Razor view engine):
И действия:
Который дает этот результат (после отправки формы отображается экран с сообщениями проверки):
Как видите, модель представления имеет много ролей:
LabelFor
,EditorFor
,DisplayFor
хелперов).Еще один пример модели представления и ее поиска: мы хотим отобразить основные данные пользователя, его привилегии и имя пользователя. Мы создаем специальную модель представления, которая содержит только обязательные поля. Мы извлекаем данные из разных сущностей из базы данных, но представление знает только о классе модели представления:
индексирование:
источник
Изменить: я обновил этот ответ в своем блоге:
http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development
Мой ответ немного длинен, но я думаю, что важно сравнить модели представления с другими типами часто используемых моделей, чтобы понять, почему они отличаются и почему они необходимы.
Подводя итог, и прямо ответить на вопрос, который задают:
Вообще говоря, модель представления - это объект, который содержит все свойства и методы, необходимые для визуализации представления. Свойства модели представления часто связаны с объектами данных, такими как клиенты и заказы, и, кроме того, они также содержат свойства, связанные с страницей или самим приложением, такие как имя пользователя, имя приложения и т. Д. Модели представления предоставляют удобный объект для передачи в механизм рендеринга. создать HTML-страницу. Одна из многих причин использования модели представления заключается в том, что модели представления предоставляют способ модульного тестирования определенных задач представления, таких как обработка пользовательского ввода, проверка данных, получение данных для отображения и т. Д.
Вот сравнение моделей Entity (a.ka. DTO's a.ka. models), презентационных моделей и моделей просмотра.
Объекты передачи данных ака «Модель»
Объект передачи данных (DTO) - это класс со свойствами, которые соответствуют схеме таблицы в базе данных. DTO названы по их общему использованию для передачи данных в и из хранилища данных.
Характеристики DTO:
• являются бизнес-объектами - их определение зависит от данных приложения.
• Обычно содержат только свойства - без кода.
• В основном используется для передачи данных в базу данных и из нее.
• Свойства точно или близко совпадают с полями определенной таблицы в хранилище данных.
Таблицы базы данных обычно нормализуются, поэтому DTO обычно также нормализуются. Это делает их ограниченным использованием для представления данных. Однако для некоторых простых структур данных они часто работают достаточно хорошо.
Вот два примера того, как может выглядеть DTO:
Презентационные модели
Модель представления - это служебный класс, который используется для отображения данных на экране или в отчете. Модели представления обычно используются для моделирования сложных структур данных, которые состоят из данных из нескольких DTO. Модели представления часто представляют денормализованное представление данных.
Характеристики презентационных моделей:
• являются бизнес-объектами - их определение зависит от данных приложения.
• Содержат в основном свойства. Код обычно ограничен форматированием данных или преобразованием в или из DTO. Модели презентаций не должны содержать бизнес-логики.
• Часто представляют денормализованное представление данных. То есть они часто объединяют свойства нескольких DTO.
• Часто содержат свойства другого базового типа, чем DTO. Например, суммы в долларах могут быть представлены в виде строк, поэтому они могут содержать запятые и символ валюты.
• Часто определяется тем, как они используются, а также характеристиками их объектов. Другими словами, простой DTO, который используется в качестве вспомогательной модели для визуализации сетки, на самом деле также является моделью представления в контексте этой сетки.
Модели представления используются «по мере необходимости» и «где необходимо» (тогда как DTO обычно привязаны к схеме базы данных). Модель представления может использоваться для моделирования данных для всей страницы, сетки на странице или раскрывающегося списка сетки на странице. Модели презентаций часто содержат свойства, которые являются другими моделями презентаций. Модели представления часто создаются для одноразового использования, например, для визуализации конкретной сетки на одной странице.
Пример модели презентации:
Посмотреть модели
Модель представления аналогична модели представления в том, что является базовым классом для визуализации представления. Однако это очень отличается от модели представления или DTO в том, как она построена. Модели представлений часто содержат те же свойства, что и модели представления и DTO, и по этой причине их часто путают друг с другом.
Характеристики моделей просмотра:
• Являются ли единственным источником данных, используемых для отображения страницы или экрана. Обычно это означает, что модель представления будет предоставлять все свойства, которые любой элемент управления на странице должен будет правильно отображать. Создание модели представления в качестве единственного источника данных для представления значительно улучшает его возможности и ценность для модульного тестирования.
• являются составными объектами, которые содержат свойства, которые состоят из данных приложения, а также свойств, которые используются кодом приложения. Эта характеристика имеет решающее значение при разработке модели представления для повторного использования и обсуждается в примерах ниже.
• Содержать код приложения. Модели представления обычно содержат методы, которые вызываются во время рендеринга и когда пользователь взаимодействует со страницей. Этот код обычно относится к обработке событий, анимации, видимости элементов управления, стилям и т. Д.
• Содержат код, который вызывает бизнес-сервисы с целью извлечения данных или отправки их на сервер базы данных. Этот код часто ошибочно помещается в контроллер. Вызов бизнес-сервисов из контроллера обычно ограничивает полезность модели представления для модульного тестирования. Чтобы было понятно, сами модели представлений не должны содержать бизнес-логику, а должны вызывать сервисы, которые содержат бизнес-логику.
• Часто содержат свойства, которые являются другими моделями представления для других страниц или экранов.
• написаны «на страницу» или «на экран». Уникальная модель представления обычно пишется для каждой страницы или экрана в приложении.
• Обычно наследуются от базового класса, поскольку большинство страниц и экранов имеют общие свойства.
Посмотреть состав модели
Как указывалось ранее, модели представления являются составными объектами в том смысле, что они объединяют свойства приложения и свойства бизнес-данных в одном объекте. Примеры часто используемых свойств приложения, которые используются в моделях представления:
• Свойства, которые используются для отображения состояния приложения, такие как сообщения об ошибках, имя пользователя, состояние и т. Д.
• Свойства, используемые для форматирования, отображения, стилизации или анимации элементов управления.
• Свойства, используемые для привязки данных, такие как объекты списка и свойства, которые содержат промежуточные данные, введенные пользователем.
Следующие примеры показывают, почему составная природа моделей представлений важна и как мы можем наилучшим образом построить модель представления, которая была бы эффективной и многократно используемой.
Предположим, мы пишем веб-приложение. Одним из требований дизайна приложения является то, что заголовок страницы, имя пользователя и имя приложения должны отображаться на каждой странице. Если мы хотим создать страницу для отображения объекта заказа презентации, мы можем изменить модель презентации следующим образом:
Этот дизайн может работать ... но что если мы хотим создать страницу, которая будет отображать список заказов? Свойства PageTitle, UserName и ApplicationName будут повторяться и станут неудобными для работы. Кроме того, что, если мы хотим определить некоторую логику на уровне страницы в конструкторе класса? Мы больше не можем этого делать, если создадим экземпляр для каждого заказа, который будет отображаться.
Композиция по наследству
Вот способ, которым мы могли бы пересмотреть модель представления заказа так, чтобы она стала истинной моделью представления и была бы полезна для отображения одного объекта PresentationOrder или коллекции объектов PresentationOrder:
Глядя на вышеупомянутые два класса, мы видим, что один из способов думать о модели представления - это то, что это модель представления, которая содержит другую модель представления в качестве свойства. Модель представления верхнего уровня (то есть модель представления) содержит свойства, которые относятся к странице или приложению, в то время как модель представления (свойство) содержит свойства, которые относятся к данным приложения.
Мы можем продвинуть наш дизайн дальше и создать класс модели базового представления, который можно использовать не только для PresentationOrders, но и для любого другого класса:
Теперь мы можем упростить наш PresentationOrderVM следующим образом:
Мы можем сделать нашу BaseViewModel еще более пригодной для повторного использования, сделав ее универсальной:
Теперь наши реализации просты:
источник
MyViewModel<MyPresModel>
Если у вас есть свойства, специфичные для представления и не связанные с БД / Сервисом / Хранилищем данных, рекомендуется использовать ViewModels. Скажем, вы хотите оставить флажок на основе поля БД (или двух), но само поле БД не является логическим. Хотя можно создать эти свойства в самой модели и скрыть ее от привязки к данным, вы можете не захламлять модель в зависимости от количества таких полей и транзакций.
Если данных и / или преобразований для конкретного вида слишком мало, вы можете использовать саму модель
источник
Я не читал все посты, но в каждом ответе, похоже, отсутствует одна концепция, которая действительно помогла мне "получить это" ...
Если Модель сродни Таблице базы данных , то ViewModel сродни Представлению базы данных - Представление обычно либо возвращает небольшие объемы данных из одной таблицы, либо сложные наборы данных из нескольких таблиц (объединений).
Я использую ViewModels для передачи информации в представление / форму, а затем переношу эти данные в действительную модель, когда форма отправляет обратно в контроллер, что также очень удобно для хранения списков (IEnumerable).
источник
У MVC нет модели представления: у нее есть модель, представление и контроллер. Модель представления является частью MVVM (Model-View-Viewmodel). MVVM создан на основе модели представления и популяризируется в WPF. В MVVM также должна быть модель, но большинство людей полностью упускают суть этого шаблона, и у них будет только представление и модель представления. Модель в MVC аналогична модели в MVVM.
В MVC процесс разделен на 3 разные обязанности:
MVC не очень подходит для веб-приложений. Это шаблон, представленный Smalltalk для создания настольных приложений. Веб-среда ведет себя совершенно иначе. Нет смысла копировать 40-летнюю концепцию из настольной разработки и вставлять ее в веб-среду. Однако многие люди думают, что это нормально, потому что их приложение компилирует и возвращает правильные значения. Этого, на мой взгляд, недостаточно, чтобы объявить определенный выбор дизайна приемлемым.
Примером модели в веб-приложении может быть:
Контроллер может использовать это так:
Ваши методы контроллера и ваши модели будут небольшими, легко тестируемыми и точными.
источник
Модель представления a - это простой класс, который может содержать более одного свойства класса. Мы используем его для наследования всех необходимых свойств, например, у меня есть два класса Student и Subject.
Теперь мы хотим отображать записи Имя ученика и Имя субъекта в представлении (в MVC), но невозможно добавить более одного класса, например:
приведенный выше код выдаст ошибку ...
Теперь мы создаем один класс и можем дать ему любое имя, но этот формат «XyzViewModel» облегчит понимание. Это концепция наследования. Теперь мы создаем третий класс со следующим именем:
Теперь мы используем эту ViewModel в View
Теперь мы можем получить доступ ко всем свойствам StudentViewModel и унаследованного класса в View.
источник
Много больших примеров, позвольте мне объяснить в ясной и хрустящей форме.
ViewModel = Модель, созданная для обслуживания представления.
Представление ASP.NET MVC не может иметь более одной модели, поэтому, если нам нужно отобразить в представлении свойства нескольких моделей, это невозможно. ViewModel служит этой цели.
Модель представления - это класс модели, который может содержать только те свойства, которые требуются для представления. Он также может содержать свойства более чем одной сущности (таблицы) базы данных. Как следует из названия, эта модель создается в соответствии с требованиями View.
Несколько примеров моделей просмотра приведены ниже
ViewModel также можно использовать для вставки, обновления записей в более чем один объект, однако основное использование ViewModel - отображение столбцов из нескольких объектов (модели) в одном представлении.
Способ создания ViewModel аналогичен созданию Model, способ создания представления для Viewmodel аналогичен созданию представления для Model.
Вот небольшой пример списка данных с использованием ViewModel .
Надеюсь, это будет полезно.
источник
ViewModel - это обходной путь, исправляющий концептуальную неуклюжесть инфраструктуры MVC. Он представляет 4-й уровень в 3-уровневой архитектуре Model-View-Controller. когда модель (модель предметной области) не подходит, слишком велика (больше, чем 2-3 поля) для представления, мы создаем меньшую модель представления для передачи ее в представление.
источник
Модель представления - это концептуальная модель данных. Он используется, например, для получения подмножества или объединения данных из разных таблиц.
Возможно, вы захотите только определенные свойства, так что это позволяет загружать только те, а не дополнительные ненужные свойства
источник
Проектирование ViewModel
Представление модели представления в представлении
Работа с действием
источник
View Model - это класс, который мы можем использовать для визуализации данных в View. Предположим, у вас есть две сущности Place и PlaceCategory и вы хотите получить доступ к данным обеих сущностей, используя одну модель, тогда мы используем ViewModel.
Таким образом, в приведенном выше примере Place и Category - это две разные сущности, а ViewModel для PlaceCategory - это ViewModel, которую мы можем использовать в View.
источник
Если вы хотите изучить код, как настроить «базовое» веб-приложение с помощью ViewModels, я могу посоветовать загрузить этот код на GitHub: https://github.com/ajsaulsberry/BlipAjax . Я разработал крупные корпоративные приложения. Когда вы делаете это, проблематично настроить хорошую архитектуру, которая обрабатывает все эти функциональные возможности «ViewModel». Я думаю, что с BlipAjax у вас будет очень хороший «базовый уровень» для начала. Это просто простой веб-сайт, но отличный в своей простоте. Мне нравится, как они использовали английский язык, чтобы указать на то, что действительно нужно в приложении.
источник