MVC Model
MVC中的模型,可以理解为那些发送信息到数据库,执行业务计算并在视图中渲染的模型对象。换句话说,这些对象代表着应用程序关注的域,模型就是要显示、保存、创建、更新和删除的对象。
那么创建MVC Model我们需要注意什么呢?MVC模板提供了启动应用程序需要的所有项:一个基本的布局视图、一个带有用户登录链接的默认首页、一个初始的样式表和一个相对较空的Models文件夹。Models文件夹中有两个文件:AccountViewModels.cs以及IdentityModels.cs文件。这两个文件都与用户账户管理有关。
构造基架
须知,当我们创建视图时,会有模板供我们使用,这种代码生成的过程就叫做“基架”。ASP.NET MVC中的基架可以为应用程序的创建、读取、更新和删除(CRUD)功能生成所需的样板代码。基架模板检测模型类的定义,然后生成控制器以及与该控制器关联的视图,有些情况下还会生成数据访问类。如果我们不喜欢默认的基架,也可以在NuGet库中查找可替代的基架模板。
基架和实体框架
新建的ASP.NET MVC5x项目会自动包含对实体框架的引用。EF是一个对象关系映射框架,它不但知道如何在关系型数据库中保存.NET对象,而且还可以利用LINQ查询语句检索那些保存在关系型数据库中的.NET对象。EF支持s数据库优先、模型优先h和代码优先(是指可以在不创建s数据库模式、也不打开VS设计器的情况下,向SQL Server中存储或检索信息)的风格。可以编写纯C#类,因为EF知道如何将这些类的实例c存储到正确位置。模型对象中的所有属性都是虚拟的,虚拟属性不是必需的,d但是它们给EF提供了一个指向纯C#类集的钩子(hook),并未EF启用了一些特性,如高效的修改跟踪机制。EF需要知道模型属性值的修改时刻,因为它要在这一时刻s生成并执行一个sql uodate语句,使这些改变和数据库保持一致。
模型绑定
Edit视图会将表单中的值提交给服务器,若是为了更新某些值,可能会从请求中直接提取这些值:
如图所示,这样获取表单提交的值,无疑在需要获取较多值的情况下使代码变得冗长。因此我们可以考虑从Form集合中提取属性并将这些值存储在某属性中,而且任何不是z字符串类型的s属性都需要进行类型转换。幸运的是,Edit视图认真的命名了每一个表单输入来匹配某些属性。因此,我们可以根据命名约定编写一段通用代码来解决这个问题。
[HttpPost]
public ActionResult Edit(Album album)
{
if (ModelState.IsValid)
{
db.Entry(album).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
return View(album);
}
当操作带有一个参数时,MVC运行环境就会使用一个模型绑定器来构建这个参数。在MVC运行时中,可以为不同类型的模型注册多个模型绑定器,一般情况下默认的绑定器是DefaultModelBinder。在Album对象的情形中,默认的模型绑定器检查Album类,并查找n能用于绑定的所有Album属性。遵照命名约定,默认的模型绑定器n能自动地将请求中的值转换和移入到一个Album对象中(模型绑定器也可以创建一个对象实例来填充)。