戳戳猫的小窝
更新日志
关于
Models文件下的模型因为和数据库紧密关联,最好不要直接作为视图和控制器中间的传递媒介,不然如果想在显示时添加某些字段,会变动数据库表的结构。 因此,可以创建一个专门用于**视图**和**控制器**传递数据的模型**ViewModel**,也叫**视图模型**。 # 创建ViewModel 在项目根目录下创建一个名为**ViewModels**的文件夹,并在**ViewModels文件夹**下创建视图模型类**MajorViewModel**。 **MajorViewModel视图模型类**的字段和**Major模型类**中的属性一样,有**Id**和**Name**。 代码如下: ``` public class MajorViewModel { public Guid Id { get; set; } [Display(Name = "专业名称")] public string Name { get; set; } = string.Empty; } ``` 其中,`[Display(Name = "专业名称")]`表示当视图中在可能出现**Name属性**的含义的地方,将显示**专业名称**字样。 # 修改视图 在Add.cshtml中,将指定模型修改为**MajorViewModel**。 由于MajorViewModel处于StuInfoManaSys.ViewModels命名空间下,因此还需要修改命名空间。 代码如下: ``` @using StuInfoManaSys.ViewModels @model MajorViewModel ``` 对于之后的功能,如果每一个视图中都去指定命名空间,显得非常繁琐,因此可以将`@using StuInfoManaSys.ViewModels`这一指令移步到**_ViewImports.cshtml**中。 ### label中的asp-for 现在可以将**label**标签中的文本删除,并添加**asp-for**属性,代码如下: ``` <label asp-for="Name" class="label"></label> ``` label中的**asp-for**会根据模型中属性的**[Display]**特性将**label**的文本设置为**Display**中的**Name**属性,例如,在**MajorViewModel**中,**Name**的**Display**的**Name**属性是专业名称,因此,它会将专业名称这几个字填充到label中充当文本。 # ViewModel与Model的转换 回到控制器中,现在Add动作接收的参数类型已经又Major变为MajorViewModel了,代码如下: ``` [HttpPost] public IActionResult Add(MajorViewModel model) { majorRepo.Insert(model); return RedirectToAction("Index"); } ``` 但是,简单地将参数类型修改并不解决问题,因为**Insert方法**并不接收**MajorViewModel**类型的数据,它只接收**Major**类型的数据,因此还需要将**MajorViewModel**类型的数据转换为**Major**类型的数据。 最终代码如下: ``` [HttpPost] public IActionResult Add(MajorViewModel model) { Major major = new Major() { Name = model.Name, }; majorRepo.Insert(major); return RedirectToAction("Index"); } ```
创建视图模型