Что такое ViewModel в MVC? - PullRequest
       3

Что такое ViewModel в MVC?

17 голосов
/ 17 февраля 2012

Правильно ли я считаю, что это почти как обертка для всех объектов, необходимых для просмотра?

Например, скажем, у вас был интернет-магазин, который продавал музыку и DVD.На странице просмотра вы хотите отобразить список всех ваших DVD и музыки.Поэтому вы бы построили объект ViewModel, который имеет два свойства, содержащие список альбомов и список DVD?

Насколько я понимаю, у вас есть все ваши классы моделей, т.е.класс Album / Dvd, но просто пропустить их в одиночку будет недостаточно для вашего просмотра.Является ли ViewModel в основном носителем для всех данных, которые требуются вашему View?

Ответы [ 2 ]

16 голосов
/ 17 февраля 2012

Ваше понимание в основном верно, но оно неполно.

ViewModel может также выполнять преобразования из типа данных, которые ваша Модель переносит в тип данных, с которыми ваш View может удобно работать; это может даже означать, что ViewModel не несет Модели напрямую, но другие суда, которые несут (возможно, подмножество) ту же информацию в более подходящем формате.

Учтите, что у вас может быть модель библиотеки, которая объединяет альбомы и DVD-диски - разница между такой моделью и соответствующей ViewModel заключается именно в том, что модель не заботится (или даже не знает) о представлении, в то время как у модели представления выразить цель содействия этому.

2 голосов
/ 13 ноября 2018
  1. ViewModel содержит поля, которые представлены в представлении (для LabelFor, EditorFor, DisplayFor помощников)
  2. ViewModel может иметь определенные правила проверки с использованием аннотаций данных. или IDataErrorInfo.
  3. ViewModel может иметь несколько объектов или объектов из разных данных модели или источник данных.

Проектирование ViewModel

public class UserLoginViewModel 
{ 
[Required(ErrorMessage = "Please enter your username")] 
[Display(Name = "User Name")]
[MaxLength(50)]
public string UserName { get; set; }
 [Required(ErrorMessage = "Please enter your password")]
 [Display(Name = "Password")]
 [MaxLength(50)]
 public string Password { get; set; } 
} 

Представление модели представления в представлении

@model MyModels.UserLoginViewModel 
@{
 ViewBag.Title = "User Login";
 Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{
<div class="editor-label">
 @Html.LabelFor(m => m.UserName)
</div>
<div class="editor-field">
 @Html.TextBoxFor(m => m.UserName)
 @Html.ValidationMessageFor(m => m.UserName)
</div>
<div class="editor-label">
 @Html.LabelFor(m => m.Password)
</div>
<div class="editor-field">
 @Html.PasswordFor(m => m.Password)
 @Html.ValidationMessageFor(m => m.Password)
</div>
<p>
 <input type="submit" value="Log In" />
</p>
</div>
}

Работа с действием

public ActionResult Login()
{ 
return View();
}
[HttpPost]
public ActionResult Login(UserLoginViewModel user)
{
// To acces data using LINQ
DataClassesDataContext mobjentity = new DataClassesDataContext();
 if (ModelState.IsValid) 
{ 
try
 {
 var q = mobjentity.tblUsers.Where(m => m.UserName == user.UserName && m.Password == user.Password).ToList(); 
 if (q.Count > 0) 
 { 
 return RedirectToAction("MyAccount");
 }
 else
 {
 ModelState.AddModelError("", "The user name or password provided is incorrect.");
 }
 }
 catch (Exception ex)
 {
 } 
 } 
 return View(user);
} 
  1. В ViewModel поместите только те поля / данные, которые вы хотите отобразить на просмотр / стр.

  2. Поскольку представление представляет свойства ViewModel, следовательно, это Легко для рендеринга и обслуживания.

  3. Используйте маппер, когда ViewModel становится более сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...