ASP.NET MVC4入门教程(五):从控制器访问数据模型
在本节中,您将创建一个新的moviescontroller类,并在这个controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里。
在开始下一步前,先build一下应用程序(生成应用程序)(确保应用程序编译没有问题)
用鼠标右键单击controller文件夹,并创建一个新的 moviescontroller控制器。当build成功后,会出现下面的选项。设定以下选项:
· 控制器名称: moviescontroller.(这是默认值)。
· 模板: mvc controller with read/write actions and views, using entity framework.
· 模型类:movie (mvcmovie.models).
· 数据上下文类: moviedbcontext (mvcmovie.models).
· 意见:razor (cshtml).(默认值)。
单击添加。visual studio express 会创建以下文件和文件夹:
· 项目控制器文件夹中的moviescontroller.cs文件。
· 项目视图文件夹下的 movie文件夹。
· 在新的views\movies文件夹中创建create.cshtml、 delete.cshtml、 details.cshtml、 edit.cshtml和index.cshtml 文件。
asp.net mvc 4 自动创建 crud (创建、 读取、 更新和删除) 操作方法,和相关的视图文件(crud 自动创建的操作方法和视图文件被称为基础结构文件)。现在您有了可以创建,列表、 编辑和删电影entity 所有的web功能了。
运行应用程序,通过将/movies追加到浏览器地址栏 url的后面,从而浏览movies控制器。因为应用程序依赖于默认路由 ( global.asax文件中的定义),浏览器请求http://localhost:xxxxx/movies将被路由到movies控制器默认的index 操作方法。换句话说,浏览器请求http://localhost:xxxxx/movies等同于浏览器请求http://localhost:xxxxx/movies/index。因为您还没有添加任何内容,所以结果是一个空的电影列表。
创建电影
点击create new链接。输入有关电影的一些详细信息,然后单击create按钮。
单击create按钮将使得窗体提交至服务器,同时电影信息也会保存到数据库里,然后您会被重定向到url/movies,您可以在列表中看到您刚刚创建的新电影。
创建一些更多的电影数据。同时也可以尝试点击编辑、详细信息和删除功能的链接。
看一下生成的代码
打开controllers\moviescontroller.cs文件,并找到生成的index方法。一本部分电影控制器和index方法如下所示。
public class moviescontroller : controller { private moviedbcontext db = new moviedbcontext(); // // get: /movies/ public actionresult index() { return view(db.movies.tolist()); } }
下面是moviescontroller类中实例化电影数据库上下文实例,如前面所述。电影数据库上下文实例可用于查询、 编辑和删除的电影。
private moviedbcontext db = new moviedbcontext();
向movies控制器请求,从而返回movies电影数据库表中的所有记录,然后将结果传递给index视图。
强类型模型和 @model 关键字
在本系列之前的教程中,您看到了使用viewbag对象,从控制器传递数据或对象给视图模板。viewbag是一个动态的对象,提供了方便的后期绑定方法将信息传递给视图。
asp.net mvc 还提供了传递强类型数据或对象到视图模板的能力。这种强类型使得更好的在编译时检查您的代码并在visual studio 编辑器中提供更加丰富的智能感知。当创建操作方法和视图时, visual studio 中的基础结构机制使用了moviescontroller类和视图模板。
在controllers\moviescontroller.cs文件中看一下生成的details方法。电影控制器里的details方法如下所示。
public actionresult details(int id = 0) { movie movie = db.movies.find(id); if (movie == null) { return httpnotfound(); } return view(movie); }
如果查找到了一个movie,movie 模型的实例会传递给detail视图。看一下views\movies\details.cshtml文件里的内容。
通过引入视图模板文件顶部的@model语句,您可以指定该视图期望的对象类型。当您创建电影控制器时,visual studio 会将@model声明自动包含到details.cshtml文件的顶部:
@model mvcmovie.models.movie
此@model声明使得控制器可以将强类型的model对象传递给view视图, 从而您可以在视图里访问传递过来的强类型电影model。例如,在details.cshtml模板中,displaynamefor 和displayfor html helper通过强类型的model对象传递了电影的每个字段。创建和编辑方法还有视图模板都在传递电影的强类型模型对象。
看一下index.cshtml视图模版和moviescontroller.cs中的index 方法。请注意这些代码是如何在index操作方法中,创建list对象,并调用view方法的。
此代码在控制器中传递movies列表给视图:
public actionresult index() { return view(db.movies.tolist()); }
当您创建电影控制器时,visual studio express会自动包含 @model语句到index.cshtml文件的顶部:
@model ienumerable<mvcmovie.models.movie>
此@model声明使得控制器可以将强类型的电影列表model对象传递给view视图。例如,在index.cshtml模板中,在强类型的model对象上使用foreach语句循环遍历电影列表:
@foreach (var item in model) { <tr> <td> @html.displayfor(modelitem => item.title) </td> <td> @html.displayfor(modelitem => item.releasedate) </td> <td> @html.displayfor(modelitem => item.genre) </td> <td> @html.displayfor(modelitem => item.price) </td> <th> @html.displayfor(modelitem => item.rating) </th> <td> @html.actionlink("edit", "edit", new { id=item.id }) | @html.actionlink("details", "details", { id=item.id }) | @html.actionlink("delete", "delete", { id=item.id }) </td> </tr> }
因为model对象是强类型的 (是ienumerable<movie>对象),所以在循环中的每个item对象的类型是movie类型。好处之一是,这意味着您可以在代码编译时进行检查,同时在代码编辑器中支持更加全面的智能感知:
使用sql server localdb
entity framework code first代码优先,如果检测到不存在一个数据库连接字符串指向了movies数据库,会自动的创建数据库。在app_data文件夹中找一下,您可以验证它已经被创建了。如果您看不到movies.mdf文件,请在解决方案资源管理器工具栏上,单击显示所有文件按钮,单击刷新按钮,然后展开app_data文件夹。
双击movies.mdf打开数据库资源管理器,然后展开表文件夹以查看电影表。
注: 如果没有显示数据库资源管理器,可以从工具菜单中,选择连接到数据库,然后关闭选择数据源对话框。这样将强制打开数据库资源管理器。
注: 如果您使用的 vwd 或 visual studio 2010 可能会看到类似下面的错误信息:
· 因为数据库 ' c:\webs\mvc4\mvcmovie\mvcmovie\app_data\movies.mdf ' 是 706 版本的,所以无法打开。本服务器支持 655 和更早版本的数据库。无法降级支持。
· "invalidoperation exception was unhandled by user code" 所提供的 sqlconnection 没有指定初始数据库。
您需要安装sql server 数据工具和localdb。并验证在前面所指定的moviedbcontext 连接字符串。
右键单击movies表并选择显示表数据以查看您所创建的数据。
右键单击movies表,选择打开表定义查看entity framework代码优先所创建表的表结构。
请注意,如何将movies表的表结构映射到您早些时候所创建的movie类?entity framework 代码优先为您自动创建了基于movie类的表结构。
当您完成操作后,通过右键单击moviedbcontext ,选择关闭连接关闭该数据库连接。(如果您没有关闭连接,当您下次运行该项目时,可能会出现错误)。
现在,您可以在简单列表页面里,来显示数据库里的数据了。在下一次的教程中,我们会继续看看框架自动生成的其它代码。并添加一个searchindex方法和searchindex视图,使您可以在数据库中搜索电影了。