从控制器访问模型的数据 (C#)
作者: 里克·安德森
注意
此处提供了本教程的更新版本,它使用 ASP.NET MVC 5 和 Visual Studio 2013。 它更安全,更易于遵循并演示更多功能。
本教程将介绍如何使用 Microsoft Visual Web Developer 2010 Express Service Pack 1 生成 ASP.NET MVC Web 应用程序的基本知识,这是 visual Studio 的免费 Microsoft版本。 在开始之前,请确保已安装下面列出的先决条件。 可以通过单击以下链接来安装所有这些组件: Web 平台安装程序。 或者,可使用以下链接单独安装各个必备软件:
如果使用 Visual Studio 2010 而不是 Visual Web Developer 2010,请单击以下链接安装必备组件: Visual Studio 2010 先决条件。
带有 C# 源代码的 Visual Web 开发人员项目随本主题一起提供。 下载 C# 版本。 如果更喜欢 Visual Basic,请切换到 本教程的 Visual Basic 版本 。
在本部分中,你将创建一个新 MoviesController
类并编写代码,以检索电影数据,并使用视图模板在浏览器中显示它。 在继续操作之前,请务必生成应用程序。
右键单击 “控制器” 文件夹并创建新的 MoviesController
控制器。 选择以下选项:
- 控制器名称: MoviesController。 (这是默认值。)
- 模板: 使用 Entity Framework 使用读/写操作和视图的控制器。
- 模型类:电影(MvcMovie.Models)。
- 数据上下文类:MovieDBContext (MvcMovie.Models)。
- 视图: Razor (CSHTML)。 (默认值)。
单击“添加” 。 Visual Web 开发人员创建以下文件和文件夹:
- 项目的 Controllers 文件夹中的MoviesController.cs文件。
- 项目的 Views 文件夹中的 Movies 文件夹。
- 新建 Views\Movies 文件夹中的 Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml 和 Index.cshtml。
ASP.NET MVC 3 基架机制会自动为你创建 CRUD(创建、读取、更新和删除)操作方法和视图。 现在,你有了一个功能齐全的 Web 应用程序,可用于创建、列出、编辑和删除电影条目。
运行应用程序并通过将 /Movies 追加到浏览器地址栏中的 URL,浏览到Movies
控制器。 由于应用程序依赖于默认路由(在 Global.asax 文件中定义),因此浏览器请求 http://localhost:xxxxx/Movies
将路由到控制器的默认 Index
操作方法 Movies
。 换句话说,浏览器请求 http://localhost:xxxxx/Movies
实际上与浏览器请求 http://localhost:xxxxx/Movies/Index
相同。 结果是一个空的电影列表,因为你尚未添加任何影片。
创建电影
选择“新建”链接。 输入有关电影的一些详细信息,然后单击“ 创建 ”按钮。
单击“创建”按钮会导致窗体发布到服务器,其中电影信息保存在数据库中。 然后重定向到 /Movies URL,可在其中查看列表中新建的电影。
再创建几个其他的电影条目。 试用“编辑”、“详细信息”和“删除”链接,它们均可正常工作。
检查生成的代码
打开 Controllers\MoviesController.cs 文件并检查生成的Index
方法。 下面显示了带该方法的电影控制器 Index
的一部分。
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
//
// GET: /Movies/
public ViewResult Index()
{
return View(db.Movies.ToList());
}
类中的 MoviesController
以下行实例化电影数据库上下文,如前所述。 可以使用电影数据库上下文来查询、编辑和删除电影。
private MovieDBContext db = new MovieDBContext();
对 Movies
控制器的请求将返回电影数据库表中的所有条目 Movies
,然后将结果传递给 Index
视图。
强类型模型和 @model 关键字
在本教程的前面部分,你了解了控制器如何使用该 ViewBag
对象将数据或对象传递到视图模板。 ViewBag
这是一个动态对象,它提供了一种方便的后期绑定方式,用于将信息传递给视图。
ASP.NET MVC 还提供将强类型数据或对象传递到视图模板的功能。 这种强类型方法可在 Visual Web 开发人员编辑器中更好地对代码进行编译时检查和更丰富的 IntelliSense。 我们将此方法与 MoviesController
类和 Index.cshtml 视图模板配合使用。
请注意代码在操作方法中Index
调用View
帮助程序方法时如何创建List
对象。 然后,代码将此 Movies
列表从控制器传递到视图:
public ViewResult Index()
{
return View(db.Movies.ToList());
}
通过在视图模板文件的顶部包括 @model
语句,可以指定视图所需的对象类型。 创建电影控制器时,Visual Web 开发人员会自动在 Index.cshtml 文件的顶部包含以下@model
语句:
@model IEnumerable<MvcMovie.Models.Movie>
此 @model
指令允许你使用 Model
强类型对象访问控制器传递给视图的电影列表。 例如,在 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>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
由于对象 Model
是强类型化(作为对象 IEnumerable<Movie>
), item
因此循环中的每个对象都键入为 Movie
。 除其他优势外,这意味着可以在代码编辑器中获取代码的编译时检查和完整的 IntelliSense 支持:
使用 SQL Server Compact
Entity Framework Code First 检测到所提供的数据库连接字符串指向Movies
尚不存在的数据库,因此 Code First 会自动创建数据库。 可以通过在 App_Data 文件夹中查找来创建它。 如果未看到 Movies.sdf 文件,请单击解决方案资源管理器工具栏中的“显示所有文件”按钮,单击“刷新”按钮,然后展开App_Data文件夹。
双击 Movies.sdf 打开 服务器资源管理器。 然后展开 “表” 文件夹以查看已在数据库中创建的表。
注意
如果双击 Movies.sdf 时收到错误,请确保已安装 SQL Server Compact 4.0(运行时 + 工具支持)。 (有关软件的链接,请参阅本教程系列第 1 部分中的先决条件列表。如果立即安装版本,则必须关闭并重新打开 Visual Web 开发人员。
有两个表,一个用于 Movie
实体集,然后是表 EdmMetadata
。 实体 EdmMetadata
框架使用该表来确定模型和数据库何时不同步。
右键单击Movies
该表,然后选择“显示表数据”以查看所创建的数据。
右键单击该 Movies
表,然后选择“ 编辑表架构”。
请注意表的 Movies
架构如何映射到 Movie
之前创建的类。 Entity Framework Code First 根据 Movie
类自动创建此架构。
完成后,关闭连接。 (如果未关闭连接,则下次运行项目时可能会收到错误)。
现在,你拥有数据库和一个简单的列表页,用于显示其中的内容。 在下一教程中,我们将检查基架代码的其余部分,并添加一个 SearchIndex
方法和 SearchIndex
视图,用于在此数据库中搜索电影。