在MVC中,什么是ViewModel?

13 浏览
0 Comments

在MVC中,什么是ViewModel?

我是否正确地认为,它几乎像是一个View所需的所有对象的包装器?

例如,假设您有一个在线音乐和DVD销售商店。在浏览页面上,您想要显示所有DVD和音乐的列表。因此,您是否会构建一个ViewModel对象,其中包含一个包含专辑列表和DVD列表的属性?

从我的理解来看,似乎您拥有所有的模型类,即专辑/ DVD类,但仅传递这些类并不足以满足您的View的需求。 ViewModel基本上是View所需数据的载体吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments
  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; } 
} 

在视图中呈现ViewModel

@model MyModels.UserLoginViewModel 
@{
 ViewBag.Title = "User Login";
 Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{
 @Html.LabelFor(m => m.UserName)
 @Html.TextBoxFor(m => m.UserName)
 @Html.ValidationMessageFor(m => m.UserName)
 @Html.LabelFor(m => m.Password)
 @Html.PasswordFor(m => m.Password)
 @Html.ValidationMessageFor(m => m.Password)

}

与Action一起工作

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变得更加复杂时,请使用映射器。

0
0 Comments

你的理解大部分是正确的,但不是完整的。

ViewModel 可能还执行从你的 Model 所携带的数据类型到你的 View 可以方便处理的数据类型的转换;这甚至可能意味着 ViewModel 不直接携带 Models 而是其他适宜格式的载体(可能是该信息的一个子集)。

假设你有一个 Library model,聚合了相册和 DVD - 这种模型与相应的 ViewModel 之间的区别在于,Model 不关注(或甚至不知道)View,而 ViewModel 的明确目的是方便它。

0