在MVC中,什么是ViewModel?
在MVC中,什么是ViewModel?
我是否正确地认为,它几乎像是一个View所需的所有对象的包装器?
例如,假设您有一个在线音乐和DVD销售商店。在浏览页面上,您想要显示所有DVD和音乐的列表。因此,您是否会构建一个ViewModel对象,其中包含一个包含专辑列表和DVD列表的属性?
从我的理解来看,似乎您拥有所有的模型类,即专辑/ DVD类,但仅传递这些类并不足以满足您的View的需求。 ViewModel基本上是View所需数据的载体吗?
admin 更改状态以发布 2023年5月21日
- ViewModel包含在视图中表示的字段(用于LabelFor、EditorFor、DisplayFor帮助器)。
- ViewModel可以使用数据注释或IDataErrorInfo具有特定的验证规则。
- 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); }
-
在ViewModel中只放置要在视图/页面上显示的那些字段/数据。
-
由于视图表示ViewModel的属性,因此渲染和维护很容易。
-
当ViewModel变得更加复杂时,请使用映射器。