gpt4 book ai didi

asp.net-mvc - MVC 中的 ViewModel 是什么?

转载 作者:行者123 更新时间:2023-12-03 03:56:27 26 4
gpt4 key购买 nike

我是 ASP.NET MVC 的新手。我在理解 ViewModel 的用途时遇到问题。

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

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

最佳答案

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

假设您有一个 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; }
}

View 模型与域模型的不同之处在于, View 模型仅包含您要在 View 上使用的数据(由属性表示)。例如,假设您要添加新员工记录,您的 View 模型可能如下所示:
public class CreateEmployeeViewModel
{
public string FirstName { get; set; }

public string LastName { get; set; }
}

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

加载 View /页面时,员工 Controller 中的 create action 方法将创建此 View 模型的实例,如果需要填充任何字段,然后将此 View 模型传递给 View /页面:
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
}
}

您的 View /页面可能如下所示(假设您正在使用 ASP.NET MVCRazor View 引擎):

@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>

因此,验证将仅在 FirstName 上进行。和 LastName .使用 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; }
}

要记住的关键是 View 模型仅表示您要使用的数据 , 没有其他的。如果您有一个包含 30 个属性的域模型并且您只想更新一个值,您可以想象所有不必要的代码和验证。在这种情况下,您在 View 模型中只会有这个值/属性,而不是域对象中的所有属性。

View 模型可能不仅具有来自一个数据库表的数据。它可以合并来自另一个表的数据。以我上面关于添加新员工记录的示例为例。除了只添加名字和姓氏之外,您可能还想添加员工所在的部门。此部门列表将来自您的 Departments table 。所以现在你有来自 Employees 的数据和 Departments一个 View 模型中的表。然后您需要将以下两个属性添加到您的 View 模型并用数据填充它:
public int DepartmentId { get; set; }

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

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

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

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

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

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

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

还有一点,你并不是真的需要每个 Action 的 View 模型。如果是简单的数据,那么只使用 EmployeeViewModel 就好了.如果它是复杂的 View /页面并且它们彼此不同,那么我建议您为每个 View 使用单独的 View 模型。

我希望这能消除您对 View 模型和域模型的任何混淆。

关于asp.net-mvc - MVC 中的 ViewModel 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11064316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com