【问题标题】:In MVC, what is a ViewModel?在 MVC 中,什么是 ViewModel?
【发布时间】:2012-03-08 17:55:03
【问题描述】:

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

例如,假设您有一家销售音乐和 DVD 的在线商店。在您的浏览页面上,您希望显示所有 dvd 和音乐的列表。因此,您是否会构造一个 ViewModel 对象,该对象具有两个属性,分别是专辑列表和 dvds 列表?

据我了解,您似乎拥有所有模型类,即。一个专辑/DVD 类,但仅仅通过这些对您的视图来说是不够的。 ViewModel 是否基本上充当了 View 所需的所有数据的载体?​​

【问题讨论】:

  • What is ViewModel in MVC?的可能重复
  • @HaveNoDisplayName 不幸的是,尽管这个问题比您标记为重复的问题早 4 个月,但另一个问题的浏览量远远超过这个问题。标题让我看到了一切。
  • 另一个问题有更好的答案,因此应该将其作为副本关闭,而不是相反。

标签: asp.net-mvc


【解决方案1】:
  1. ViewModel 包含在视图中表示的字段(对于 LabelFor、EditorFor、DisplayFor 助手)
  2. ViewModel 可以使用数据注释具有特定的验证规则 或 IDataErrorInfo。
  3. 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 变得更复杂时使用映射器。

【讨论】:

    【解决方案2】:

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

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

    假设您可以拥有一个聚合专辑和 DVD 的库模型——这种模型与相应的 ViewModel 之间的区别恰恰在于,模型不关心(甚至不知道)视图,而 ViewModel 拥有表达促进它的目的。

    【讨论】:

    • 这个答案只是部分正确并且不是很明确(“...ViewModel 有促进它的明确目的”没有解释任何事情。)。 Deepakmahajan 的回答虽然不是很深入,但更正确。我在这里回答了一个相关问题,提供了更多详细信息:stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc/…
    • 未来的读者,请点击 Sam 给出的链接,看看答案。确实很有帮助。
    猜你喜欢
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多