MVC中的ViewModel是什么?

我是ASP的新手。净MVC。我在理解ViewModel的目的方面有一个问题。

什么是ViewModel,为什么我们需要一个ASP的ViewModel。NET MVC应用程序?

如果我能给出一个关于它的工作和解释的好例子,那就更好了。

389298 次浏览

视图模型是一个表示在特定视图中使用的数据模型的类。我们可以使用这个类作为登录页面的模型:

public class LoginPageVM
{
[Required(ErrorMessage = "Are you really trying to login without entering username?")]
[DisplayName("Username/e-mail")]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter password:)")]
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Stay logged in when browser is closed")]
public bool RememberMe { get; set; }
}

使用这个视图模型,你可以定义视图(Razor视图引擎):

@model CamelTrap.Models.ViewModels.LoginPageVM


@using (Html.BeginForm()) {
@Html.EditorFor(m => m);
<input type="submit" value="Save" class="submit" />
}

和行动:

[HttpGet]
public ActionResult LoginPage()
{
return View();
}


[HttpPost]
public ActionResult LoginPage(LoginPageVM model)
{
...code to login user to application...
return View(model);
}

产生这个结果(提交表单后,屏幕显示验证消息):

.

正如你所看到的,视图模型有很多角色:

  • 视图模型通过只包含在视图中表示的字段来记录视图。
  • 视图模型可能包含使用数据注释或IDataErrorInfo的特定验证规则。
  • 视图模型定义了视图的外观(对于LabelForEditorForDisplayFor helper)。
  • 视图模型可以组合来自不同数据库实体的值。
  • 你可以很容易地为视图模型指定显示模板,并使用DisplayFor或EditorFor helper在许多地方重用它们。

视图模型及其检索的另一个示例:我们希望显示基本用户数据、他的权限和用户名。我们创建一个特殊的视图模型,它只包含必需的字段。我们从数据库的不同实体中检索数据,但是视图只知道视图模型类:

public class UserVM {
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsAdministrator { get; set; }
public string MothersName { get; set; }
}

检索:

var user = db.userRepository.GetUser(id);


var model = new UserVM() {
ID = user.ID,
FirstName = user.FirstName,
LastName = user.LastName,
IsAdministrator = user.Proviledges.IsAdministrator,
MothersName = user.Mother.FirstName + " " + user.Mother.LastName
}

如果您有特定于视图的属性,并且与DB/Service/Data存储无关,那么使用ViewModels是一个很好的实践。比方说,您希望根据一个(或两个)DB字段选择一个复选框,但DB字段本身不是布尔值。虽然可以在模型本身中创建这些属性,并将其隐藏在数据绑定中,但您可能不希望根据此类字段和事务的数量使模型变得混乱。

如果特定于视图的数据和/或转换太少,您可以使用模型本身

view model表示你想在视图/页面上显示的数据,无论它是用于静态文本还是用于可以添加到数据库(或编辑)的输入值(如文本框和下拉列表)。它与你的domain model有所不同。它是视图的模型。

假设你有一个Employee类,它表示你的员工域模型,它包含以下属性(唯一标识符,名字,姓氏和创建的日期):

public class Employee : IEntity
{
public int Id { get; set; }


public string FirstName { get; set; }


public string LastName { get; set; }


public DateTime DateCreated { get; set; }
}

视图模型与域模型的不同之处在于,视图模型只包含您希望在视图上使用的数据(由属性表示)。例如,假设你想添加一个新的员工记录,你的视图模型可能是这样的:

public class CreateEmployeeViewModel
{
public string FirstName { get; set; }


public string LastName { get; set; }
}

如您所见,它只包含两个属性。这两个属性也在雇员域模型中。你可能会问为什么会这样?Id可能不会从视图中设置,它可能由Employee表自动生成。并且DateCreated也可以在存储过程或应用程序的服务层中设置。因此,视图模型中不需要IdDateCreated。当您以静态文本的形式查看员工的详细信息(已经被捕获的员工)时,您可能希望显示这两个属性。

当加载视图/页面时,员工控制器中的create action方法将创建该视图模型的实例,如果需要填充任何字段,然后将该视图模型传递给视图/页面:

public class EmployeeController : Controller
{
private readonly IEmployeeService employeeService;


public EmployeeController(IEmployeeService employeeService)
{
this.employeeService = employeeService;
}


public ActionResult Create()
{
CreateEmployeeViewModel model = new CreateEmployeeViewModel();


return View(model);
}


public ActionResult Create(CreateEmployeeViewModel model)
{
// Do what ever needs to be done before adding the employee to the database
}
}

你的视图/页面可能看起来像这样(假设你正在使用ASP.NET MVCRazor视图引擎):

@model MyProject.Web.ViewModels.CreateEmployeeViewModel


<table>
<tr>
<td><b>First Name:</b></td>
<td>@Html.TextBoxFor(m => m.FirstName, new { maxlength = "50", size = "50" })
@Html.ValidationMessageFor(m => m.FirstName)
</td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td>@Html.TextBoxFor(m => m.LastName, new { maxlength = "50", size = "50" })
@Html.ValidationMessageFor(m => m.LastName)
</td>
</tr>
</table>

因此,验证将只在FirstNameLastName上进行。使用FluentValidation,你可能有这样的验证:

public class CreateEmployeeViewModelValidator : AbstractValidator<CreateEmployeeViewModel>
{
public CreateEmployeeViewModelValidator()
{
RuleFor(m => m.FirstName)
.NotEmpty()
.WithMessage("First name required")
.Length(1, 50)
.WithMessage("First name must not be greater than 50 characters");


RuleFor(m => m.LastName)
.NotEmpty()
.WithMessage("Last name required")
.Length(1, 50)
.WithMessage("Last name must not be greater than 50 characters");
}
}

使用数据注释,它可能是这样的:

public class CreateEmployeeViewModel : ViewModelBase
{
[Display(Name = "First Name")]
[Required(ErrorMessage = "First name required")]
public string FirstName { get; set; }


[Display(Name = "Last Name")]
[Required(ErrorMessage = "Last name required")]
public string LastName { get; set; }
}

要记住的关键是视图模型只表示您想要使用的数据,没有别的了。如果您有一个具有30个属性的域模型,而您只想更新一个值,那么您可以想象所有不必要的代码和验证。在这种情况下,视图模型中只有这个值/属性,而不是域对象中的所有属性。

一个视图模型不能只包含来自一个数据库表的数据。它可以组合来自另一个表的数据。以我上面关于添加新员工记录的例子为例。除了只添加姓和名之外,您可能还想添加员工所在的部门。这个部门列表将来自你的Departments表。现在你在一个视图模型中有了来自EmployeesDepartments表的数据。然后你需要添加以下两个属性到你的视图模型,并用数据填充它:

public int DepartmentId { get; set; }


public IEnumerable<Department> Departments { get; set; }

在编辑员工数据(已经添加到数据库的员工)时,它与上面的示例没有太大区别。创建一个视图模型,例如命名为EditEmployeeViewModel。在这个视图模型中只有您想要编辑的数据,比如姓和名。编辑数据并单击提交按钮。我不会太担心Id字段,因为Id值可能在URL中,例如:

http://www.yourwebsite.com/Employee/Edit/3

取这个Id并将其与您的姓和名值一起传递到存储库层。

当删除一条记录时,我通常遵循与编辑视图模型相同的路径。我也会有一个URL,例如:

http://www.yourwebsite.com/Employee/Delete/3

当视图第一次加载时,我将使用Id(3)从数据库中获取员工的数据。然后,我将只在视图/页面上显示静态文本,以便用户可以看到正在删除的员工。当用户单击Delete按钮时,我将只使用Id值3并将其传递给我的存储库层。你只需要Id从表中删除一条记录。

另一点,你并不真的需要每个操作的视图模型。如果它是简单数据,那么只使用EmployeeViewModel就可以了。如果是复杂的视图/页面,并且它们彼此不同,那么我建议您为每个视图使用单独的视图模型。

我希望这能消除您对视图模型和域模型的任何困惑。

编辑:我在我的博客上更新了这个答案:

http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development

我的回答有点长,但我认为将视图模型与其他类型的常用模型进行比较是很重要的,这样可以理解为什么它们不同,为什么它们是必要的。

总结一下,直接回答问题:

一般来说,视图模型是一个包含呈现视图所需的所有属性和方法的对象。视图模型属性通常与客户和订单等数据对象相关,此外,它们还包含与页面或应用程序本身相关的属性,如用户名、应用程序名等。视图模型提供了一个方便的对象,可以传递给渲染引擎来创建HTML页面。使用视图模型的众多原因之一是,视图模型提供了一种对某些表示任务进行单元测试的方法,例如处理用户输入、验证数据、检索数据以供显示等。

下面是实体模型的比较。dto方。模型)、表示模型和视图模型。

数据传输对象,又称“模型”

数据传输对象(DTO)是一个类,其属性与数据库中的表模式匹配。dto的命名源于它们在数据存储间来回传输数据的常用用法。
dto特征:

  • 业务对象-它们的定义依赖于应用程序数据。
  • 通常只包含属性-没有代码。
  • 主要用于向数据库传输数据和从数据库传输数据。
  • 属性与数据存储中特定表上的字段完全匹配或紧密匹配。

数据库表通常是规范化的,因此dto通常也是规范化的。这使得它们在显示数据时用处有限。然而,对于某些简单的数据结构,它们通常表现得很好。

下面是dto的两个示例:

public class Customer
{
public int ID { get; set; }
public string CustomerName { get; set; }
}




public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; }
public DateTime OrderDate { get; set; }
public Decimal OrderAmount { get; set; }
}

演示模型

表示模型是一个实用程序类,用于在屏幕或报告上呈现数据。表示模型通常用于对由来自多个dto的数据组成的复杂数据结构进行建模。表示模型通常表示非规范化的数据视图。

表示模型的特点:

  • 业务对象-它们的定义依赖于应用程序数据。
  • 包含大部分属性。代码通常仅限于格式化数据或将其转换为DTO或从DTO转换。表示模型不应该包含业务逻辑。
  • 通常呈现非规范化的数据视图。也就是说,它们经常组合来自多个dto的属性。
  • 通常包含与DTO不同的基类型的属性。例如,美元金额可以表示为字符串,因此它们可以包含逗号和货币符号。
  • 通常由它们的使用方式以及它们的对象特征来定义。换句话说,用作呈现网格的支持模型的简单DTO实际上也是该网格上下文中的表示模型。

表示模型是“根据需要”和“在需要的地方”使用的(而dto通常绑定到数据库模式)。表示模型可用于为整个页面、页面上的网格或页面上网格上的下拉列表建模。表示模型通常包含其他表示模型的属性。表示模型通常是为单一用途而构造的,例如在单个页面上呈现特定的网格。

一个演示模型示例:

public class PresentationOrder
{
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}

视图模型

视图模型与表示模型相似,都是用于呈现视图的支持类。然而,它在构造方式上与表示模型或DTO有很大不同。视图模型通常包含与表示模型和dto相同的属性,因此,它们经常被混淆。

视图模型的特点:

  • 是用于呈现页面或屏幕的单一数据源。通常,这意味着视图模型将公开页面上任何控件正确呈现自身所需的每个属性。使视图模型成为视图的单一数据源,极大地提高了其单元测试的能力和价值。
  • 复合对象包含由应用程序数据组成的属性以及应用程序代码使用的属性。在设计视图模型以实现可重用性时,这个特性是至关重要的,下面的示例将对此进行讨论。
  • 包含应用程序代码。视图模型通常包含在呈现期间和用户与页面交互时调用的方法。这段代码通常与事件处理、动画、控件的可见性、样式等相关。
  • 包含为检索数据或将数据发送到数据库服务器而调用业务服务的代码。这段代码经常被错误地放在控制器中。从控制器调用业务服务通常会限制视图模型用于单元测试的作用。需要明确的是,视图模型本身不应该包含业务逻辑,但应该调用包含业务逻辑的服务。
  • 通常包含用于其他页面或屏幕的其他视图模型的属性。
  • 写为“每一页”或“每一屏”。一个唯一的视图模型通常是为应用程序中的每个页面或屏幕编写的。
  • 通常派生自基类,因为大多数页面和屏幕共享公共属性。

视图模型组合

如前所述,视图模型是复合对象,因为它们组合了单个对象上的应用程序属性和业务数据属性。视图模型中常用的应用程序属性示例如下:

  • 用于显示应用程序状态的属性,如错误消息、用户名、状态等。
  • 用于设置控件的格式、显示、样式化或动画化的属性。
  • 用于数据绑定的属性,如列表对象和保存用户输入的中间数据的属性。

下面的例子说明了为什么视图模型的复合性质是重要的,以及我们如何才能最好地构建一个高效且可重用的视图模型。

假设我们正在编写一个web应用程序。应用程序设计的要求之一是必须在每个页面上显示页面标题、用户名和应用程序名。如果我们想要创建一个页面来显示表示订单对象,我们可以修改表示模型如下所示:

public class PresentationOrder
{
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}

这种设计可能可行,但如果我们想创建一个显示订单列表的页面呢?PageTitle、UserName和ApplicationName属性将会重复出现,并且变得难以处理。另外,如果我们想在类的构造函数中定义一些页级逻辑呢?如果我们为将要显示的每个订单创建一个实例,就不能再这样做了。

复合优于继承

下面是一种重构订单表示模型的方法,这样它就变成了一个真正的视图模型,对于显示单个PresentationOrder对象或PresentationOrder对象的集合非常有用:

public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }


// Business properties
public PresentationOrder Order { get; set; }
}




public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }


// Business properties
public List<PresentationOrder> Orders { get; set; }
}

查看上面的两个类,我们可以看到考虑视图模型的一种方式是,它是一个包含另一个表示模型作为属性的表示模型。顶层表示模型(即视图模型)包含与页面或应用程序相关的属性,而表示模型(属性)包含与应用程序数据相关的属性。

我们可以进一步设计并创建一个基视图模型类,它不仅可以用于PresentationOrders,还可以用于任何其他类:

public class BaseViewModel
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
}

现在我们可以像这样简化我们的PresentationOrderVM:

public class PresentationOrderVM : BaseViewModel
{
// Business properties
public PresentationOrder Order { get; set; }
}


public class PresentationOrderVM : BaseViewModel
{
// Business properties
public List<PresentationOrder> Orders { get; set; }
}

我们可以通过使BaseViewModel泛型来使它更具可重用性:

public class BaseViewModel<T>
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }


// Business property
public T BusinessObject { get; set; }
}

现在我们的实现很轻松:

public class PresentationOrderVM : BaseViewModel<PresentationOrder>
{
// done!
}


public class PresentationOrderVM : BaseViewModel<List<PresentationOrder>>
{
// done!
}

视图模型a是一个简单的类,它可以包含多个类属性。我们使用它来继承所有必需的属性,例如,我有两个类Student和Subject

Public class Student
{
public int Id {get; set;}
public string Name {get; set;}
}
Public class Subject
{
public int SubjectID {get; set;}
public string SubjectName {get; set;}
}

现在我们想要在视图(MVC)中显示记录学生的名字和科目的名字,但不可能添加多个类,如:

 @model ProjectName.Model.Student
@model ProjectName.Model.Subject

上面的代码将抛出一个错误…

现在我们创建了一个类,可以给它起任何名字,但是这种格式“XyzViewModel”会让它更容易理解。这是继承的概念。 现在我们创建第三个类,名称如下:

public class StudentViewModel:Subject
{
public int ID {get; set;}
public string Name {get; set;}
}

现在我们在View中使用这个ViewModel

@ model ProjectName.Model.StudentViewModel

现在我们能够在View中访问StudentViewModel和继承类的所有属性。

MVC没有视图模型:它有模型、视图和控制器。ViewModel是MVVM (Model-View-ViewModel)的一部分。MVVM派生自表示模型,在WPF中得到推广。在MVVM中也应该有一个模型,但是大多数人完全忽略了这个模式的要点,他们只有一个视图和一个视图模型。MVC中的模型与MVVM中的模型相似。

在MVC中,这个过程分为3个不同的职责:

  • 视图负责将数据显示给用户
  • 控制器负责页面流
  • 模型负责业务逻辑

MVC不太适合web应用程序。它是Smalltalk为创建桌面应用程序引入的一种模式。web环境的行为完全不同。从桌面开发中复制一个40年前的概念并将其粘贴到web环境中并没有多大意义。然而,很多人认为这是可以的,因为他们的应用程序编译并返回正确的值。在我看来,这并不足以说明某种设计选择是可行的。

web应用程序中模型的一个例子可以是:

public class LoginModel
{
private readonly AuthenticationService authentication;


public LoginModel(AuthenticationService authentication)
{
this.authentication = authentication;
}


public bool Login()
{
return authentication.Login(Username, Password);
}


public string Username { get; set; }
public string Password { get; set; }
}

控制器可以这样使用它:

public class LoginController
{
[HttpPost]
public ActionResult Login(LoginModel model)
{
bool success = model.Login();


if (success)
{
return new RedirectResult("/dashboard");
}
else
{
TempData["message"] = "Invalid username and/or password";
return new RedirectResult("/login");
}
}
}

你的控制器方法和模型将是小的,容易测试的,并且是切中要害的。

很多大的例子,让我用一种清晰明了的方式解释。

ViewModel =为视图创建的模型。

ASP。NET MVC视图不能有多个模型,所以如果我们需要在视图中显示来自多个模型的属性,这是不可能的。ViewModel就是这个目的。

视图模型是一个模型类,它只能保存视图所需的那些属性。它还可以包含来自数据库的多个实体(表)的属性。顾名思义,这个模型是专门为View需求创建的。

下面是一些视图模型的例子

  • 要列出视图页中多个实体的数据-我们可以创建一个 查看模型,并拥有我们想要的所有实体的属性 列出数据。连接这些数据库实体并设置View模型 属性,并返回到视图以显示不同的数据 一个表格形式的实体
  • 视图模型只能定义单个实体的特定字段

ViewModel还可以用于将记录插入和更新到多个实体中,但ViewModel的主要用途是将多个实体(模型)中的列显示到单个视图中。

创建ViewModel的方法与创建Model的方法相同,为ViewModel创建视图的方法与为Model创建视图的方法相同。

下面是使用ViewModel列出数据的一个小例子。

希望这对你有用。

我没有阅读所有的帖子,但每个答案似乎都缺少一个真正帮助我“得到它”的概念……

如果Model类似于数据库< >强表< / >强,那么ViewModel类似于数据库< >强视图< / >强——视图通常要么返回来自一个表的少量数据,要么返回来自多个表(连接)的复杂数据集。

我发现自己使用ViewModels将信息传递到视图/表单中,然后在表单返回到控制器时将数据传输到有效的模型中-对于存储列表(IEnumerable)也非常方便。

ViewModel是一种解决MVC框架概念上的缺陷的方法。它代表了三层模型-视图-控制器体系结构中的第四层。当Model(域模型)不合适,对于View来说太大(大于2-3个字段)时,我们创建一个更小的ViewModel来传递给View。

视图模型是数据的概念模型。例如,它的用途是获取一个子集或组合来自不同表的数据。

您可能只需要特定的属性,因此这允许您只加载那些属性,而不添加不必要的属性。

  • ViewModel包含在视图中表示的字段(用于 李LabelFor、EditorFor DisplayFor助手)< / >
  • ViewModel可以使用数据注释拥有特定的验证规则 李或IDataErrorInfo。< / >
  • 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>
}

行动起来

public ActionResult Login()
{
return View();
}


[HttpPost]
public ActionResult Login(UserLoginViewModel user)
{
// To access 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中只放置你想要显示的字段/数据 李视图/页。< / > 因为view表示ViewModel的属性,所以它是
  2. 当ViewModel变得更加复杂时,使用mapper。

视图模型是一个类,我们可以使用它在视图上呈现数据。假设您有两个实体Place和PlaceCategory,并且您希望使用一个模型访问来自这两个实体的数据,那么我们使用ViewModel。

public class Place
{
public int PlaceId { get; set; }
public string PlaceName { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public string BestTime { get; set; }
}
public class Category
{
public int ID { get; set; }
public int? PlaceId { get; set; }
public string PlaceCategoryName { get; set; }
public string PlaceCategoryType { get; set; }
}
public class PlaceCategoryviewModel
{
public string PlaceName { get; set; }
public string BestTime { get; set; }
public string PlaceCategoryName { get; set; }
public string PlaceCategoryType { get; set; }
}

在上面的例子中,Place和Category是两个不同的实体,PlaceCategory ViewModel是我们可以在View上使用的ViewModel。

如果你想学习代码如何建立一个“基线”;我建议你在GitHub上下载这段代码:https://github.com/ajsaulsberry/BlipAjax。我开发了大型企业应用程序。当你这样做的时候,建立一个好的架构来处理所有这些“viewmodel”是有问题的。功能。我认为使用BlipAjax你会有一个很好的“基线”。首先。这只是一个简单的网站,但它的简单性很棒。我喜欢他们用英语指出申请中真正需要的东西的方式。

ViewModel是包含在MVC视图中使用的字段的模型。对视图使用ViewModel有以下好处:

  • 由于数据库模型(实体类)包含单个表的数据。如果需要来自多个表的数据,一个ViewModel可以有多个表的字段。
  • 用户不能直接与数据库模型交互,因此数据库层或模型是安全的。
  • 它用于通过存储库从数据库模型获取数据并将其传递给视图。类似地,它利用向数据库模型发布数据来更新数据库记录。

视图模型与您的数据模型相同,但您可以在其中添加2个或更多数据模型类。根据这一点,你必须改变你的控制器,一次采取2个模型

视图模型通常是两个或多个模型的聚合/组合。

假设我们有一个DB,它有两个表,分别叫Student和Course,每个表有两个模型。在客户端,我们有两个视图来呈现每个表。

想象一下,您需要另一个同时呈现学生和课程的视图?然后你可以创建一个所谓的视图模型。这基本上是一个采用两种模型的类,即学生和课程。

类combinedstudentcourses将是视图模型,并可以由视图返回。

public class Student
{
public string? Name{ get; set; }
public string? Email{ get; set; }
}

这是我们的视图模型,其中有两个模型。

public class Course
{
public string? CourseName { get; set; }
public string? CourseCode { get; set; }
}

ViewModel,即组合两个或多个模型来满足视图的特定需求。

public class SchoolSystem
{
public Students Student { get; set; }
public Courses Course { get; set; }
}
public ActionResult<SchoolSystem> Index()
{
var SchoolSystemViewModel = new SchoolSystem();
// now we have access two to tables i.e two models in our
//view.
return this.View("SchoolSystemView", SchoolSystemViewModel,);
}