从控制器访问数据模型
最后更新于:2022-04-01 16:28:52
在本节中,您将创建一个新的`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).**(默认值)。
[![clip_image001](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c66b6a7a.png "clip_image001")](http://images.cnitblog.com/blog/139239/201301/11103001-7cac885828f246a0a405778d45ab7928.png)
单击**添加**。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](http://localhostxxxxx)*。因为您还没有添加任何内容,所以结果是一个空的电影列表。
[![clip_image002](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c66cdc08.png "clip_image002")](http://images.cnitblog.com/blog/139239/201301/11103005-701b9e8ff950428187a925d5d7308e85.png)
# 创建电影
点击**Create New**链接。输入有关电影的一些详细信息,然后单击**Create**按钮。
[![clip_image003](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c66e9fd9.png "clip_image003")](http://images.cnitblog.com/blog/139239/201301/11103010-52a20ea3985a452eb1772351e8572864.png)
单击**Create**按钮将使得窗体提交至服务器,同时电影信息也会保存到数据库里,然后您会被重定向到URL/Movies,您可以在列表中看到您刚刚创建的新电影。
[![clip_image004](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c670c8d3.png "clip_image004")](http://images.cnitblog.com/blog/139239/201301/11103017-bb33593d8aae47a88372b083f6e5ff67.png)
创建一些更多的电影数据。同时也可以尝试点击**编辑**、**详细信息**和**删除**功能的链接。
#### 看一下生成的代码
打开*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](http://msdn.microsoft.com/en-us/library/system.web.mvc.html.displayextensions.displayfor(VS.98).aspx) HTML Helper通过强类型的`Model`对象传递了电影的每个字段。创建和编辑方法还有视图模板都在传递电影的强类型模型对象。
看一下*Index.cshtml*视图模版和*MoviesController.cs*中的`Index` 方法。请注意这些代码是如何在I`ndex`操作方法中,创建[`List`](http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx)对象,并调用`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`类型。好处之一是,这意味着您可以在代码编译时进行检查,同时在代码编辑器中支持更加全面的智能感知:
[![clip_image005](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c672484d.png "clip_image005")](http://images.cnitblog.com/blog/139239/201301/11103021-21d61e82cde1441ca52420ee0e387161.png)
#
# 使用SQL Server LocalDB
Entity Framework Code First代码优先,如果检测到不存在一个数据库连接字符串指向了`Movies`数据库,会自动的创建数据库。在App_Data文件夹中找一下,您可以验证它已经被创建了。如果您看不到*Movies.mdf*文件,请在**解决方案资源管理器**工具栏上,单击**显示所有文件**按钮,单击**刷新**按钮,然后展开App_Data文件夹。
[![clip_image006](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c673e5d6.png "clip_image006")](http://images.cnitblog.com/blog/139239/201301/11103024-ee6452002a8348a49ca828b93bc8acd7.png)
双击*Movies.mdf*打开**数据库资源管理器**,然后展开**表**文件夹以查看电影表。
[![clip_image007](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c6756f4e.png "clip_image007")](http://images.cnitblog.com/blog/139239/201301/11103026-3730aac3383747b0b213a542a8d8af98.png)
注: 如果没有显示数据库资源管理器,可以从**工具**菜单中,选择**连接到数据库**,然后关闭**选择数据源**对话框。这样将强制打开数据库资源管理器。
注: 如果您使用的 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 数据工具](http://blogs.msdn.com/b/rickandy/archive/2012/08/02/installing-and-using-sql-server-data-tools-ssdt-on-visual-studio-2010-and-vwd.aspx)和[LocalDB](http://www.microsoft.com/web/gallery/install.aspx?appid=SQLLocalDBOnly_11_0)。并验证在前面所指定的MovieDBContext 连接字符串。
右键单击`Movies`表并选择**显示表数据**以查看您所创建的数据。
[![clip_image008](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c6769afa.png "clip_image008")](http://images.cnitblog.com/blog/139239/201301/11103028-382bec01bf7847e39a83275633011bd9.png)
右键单击`Movies`表,选择**打开表定义**查看Entity Framework代码优先所创建表的表结构。
[![clip_image009](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c67821ce.png "clip_image009")](http://images.cnitblog.com/blog/139239/201301/11103030-b6cd0ecf2430448a96094b104db11829.png)
[![clip_image010](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c679544b.png "clip_image010")](http://images.cnitblog.com/blog/139239/201301/11103033-1c50ebbece084249b3edb2196ef273f5.png)
请注意,如何将`Movies`表的表结构映射到您早些时候所创建的`Movie`类?Entity Framework 代码优先为您自动创建了基于`Movie`类的表结构。
当您完成操作后,通过右键单击*MovieDBContext* ,选择**关闭连接**关闭该数据库连接。(如果您没有关闭连接,当您下次运行该项目时,可能会出现错误)。
[![clip_image011](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-08_57a81c67b5184.png "clip_image011")](http://images.cnitblog.com/blog/139239/201301/11103035-37a82b3614b54af8ac83e0fc3c78a8d0.png)
现在,您可以在简单列表页面里,来显示数据库里的数据了。在下一次的教程中,我们会继续看看框架自动生成的其它代码。并添加一个`SearchIndex`方法和`SearchIndex`视图,使您可以在数据库中搜索电影了。
--------------------------------------------------------------------------------------------------------------------
译者注:
本系列共9篇文章,翻译自Asp.Net MVC4 官方教程,由于本系列文章言简意赅,篇幅适中,从一个示例开始讲解,全文最终完成了一个管理影片的小系统,非常适合新手入门Asp.Net MVC4,并由此开始开发工作。9篇文章为:
1. Asp.Net MVC4 入门介绍
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4)
· 译文地址:[http://www.cnblogs.com/powertoolsteam/archive/2012/11/01/2749906.html](http://www.cnblogs.com/powertoolsteam/archive/2012/11/01/2749906.html)
2. 添加一个控制器
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller)
· 译文地址:[http://www.cnblogs.com/powertoolsteam/archive/2012/11/02/2751015.html](http://www.cnblogs.com/powertoolsteam/archive/2012/11/02/2751015.html)
3. 添加一个视图
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view)
· 译文地址:[http://www.cnblogs.com/powertoolsteam/archive/2012/11/06/2756711.html](http://www.cnblogs.com/powertoolsteam/archive/2012/11/06/2756711.html)
4. 添加一个模型
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model)
· 译文地址:[http://www.cnblogs.com/powertoolsteam/archive/2012/12/17/2821495.html](http://www.cnblogs.com/powertoolsteam/archive/2012/12/17/2821495.html)
5. 从控制器访问数据模型
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller)
· 译文地址:[http://www.cnblogs.com/powertoolsteam/archive/2013/01/11/2855935.html](http://www.cnblogs.com/powertoolsteam/archive/2013/01/11/2855935.html)
6. 验证编辑方法和编辑视图
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view)
· 译文地址:
7. 给电影表和模型添加新字段
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table)
· 译文地址:
8. 给数据模型添加校验器
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model)
· 译文地址:
9. 查询详细信息和删除记录
· 原文地址:[http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods](http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods)
· 译文地址: