Asp.net mvc 在MVC中,什么是ViewModel?

Asp.net mvc 在MVC中,什么是ViewModel?,asp.net-mvc,Asp.net Mvc,我认为它几乎就像是视图所需的所有对象的包装器,对吗 例如,假设你有一家在线商店出售音乐和DVD。在浏览页面上,您希望显示所有DVD和音乐的列表。因此,是否要构造一个ViewModel对象,该对象有两个属性,分别包含相册列表和DVD列表 从我的理解来看,你似乎有你所有的模型类,比如专辑/Dvd类,但是仅仅传递这些是不够的。ViewModel基本上可以作为视图所需所有数据的载体吗?您的理解基本上是正确的,但并不完整 ViewModel还可以执行从模型携带的数据类型到视图可以方便使用的数据类型的转换;

我认为它几乎就像是视图所需的所有对象的包装器,对吗

例如,假设你有一家在线商店出售音乐和DVD。在浏览页面上,您希望显示所有DVD和音乐的列表。因此,是否要构造一个ViewModel对象,该对象有两个属性,分别包含相册列表和DVD列表


从我的理解来看,你似乎有你所有的模型类,比如专辑/Dvd类,但是仅仅传递这些是不够的。ViewModel基本上可以作为视图所需所有数据的载体吗?

您的理解基本上是正确的,但并不完整

ViewModel还可以执行从模型携带的数据类型到视图可以方便使用的数据类型的转换;这甚至可能意味着ViewModel不直接携带模型,而是以更合适的格式携带(可能是子集)相同信息的其他船舶

考虑一下,您可以有一个聚合相册和DVD的库模型——这种模型与相应的ViewModel之间的区别在于,模型不关心(甚至不知道)视图,而ViewModel的明确目的是促进视图

  • ViewModel包含在视图中表示的字段(用于 LabelFor、EditorFor、DisplayFor helpers)
  • 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())
    {
    <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>
    }
    
  • 在ViewModel中,仅放置要显示的字段/数据 视图/页面

  • 由于视图重新呈现ViewModel的属性,因此 易于渲染和维护

  • 当ViewModel变得更复杂时,请使用贴图器


  • 这个答案只是部分正确,并不十分明确(“ViewModel的明确目的是促进它”并没有解释任何事情)。Deepakmahajan的答案更为正确,尽管不是很深入。我在这里回答了一个相关的问题,提供了更多的细节:未来的读者,跟随Sam给出的链接,看看答案。这确实非常有用。@HaveNoDisplayName的可能重复不幸的是,虽然这个问题比您标记为重复的问题早了4个月,但另一个问题的浏览量远远大于这个问题。这个标题让我看到了所有的不同。另一个问题有更好的答案,所以这个问题应该作为一个副本来结束,而不是相反。
    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);
    }