从控制器访问模型的数据 (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)。 (默认值)。

AddScaffoldedMovieController

单击“添加” 。 Visual Web 开发人员创建以下文件和文件夹:

  • 项目的 Controllers 文件夹中的MoviesController.cs文件。
  • 项目的 Views 文件夹中的 Movies 文件夹。
  • 新建 Views\Movies 文件夹中的 Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml 和 Index.cshtml

NewMovieControllerScreenShot

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相同。 结果是一个空的电影列表,因为你尚未添加任何影片。

显示“我的电影列表”页上的“M V C 电影应用”浏览器窗口的屏幕截图。

创建电影

选择“新建”链接。 输入有关电影的一些详细信息,然后单击“ 创建 ”按钮。

显示“创建”页上的“M V C 电影应用”浏览器窗口的屏幕截图。

单击“创建”按钮会导致窗体发布到服务器,其中电影信息保存在数据库中。 然后重定向到 /Movies URL,可在其中查看列表中新建的电影。

IndexWhenHarryMet

再创建几个其他的电影条目。 试用“编辑”、“详细信息”和“删除”链接,它们均可正常工作。

检查生成的代码

打开 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 支持:

ModelIntelliSense

使用 SQL Server Compact

Entity Framework Code First 检测到所提供的数据库连接字符串指向Movies尚不存在的数据库,因此 Code First 会自动创建数据库。 可以通过在 App_Data 文件夹中查找来创建它。 如果未看到 Movies.sdf 文件,请单击解决方案资源管理器工具栏中的“显示所有文件按钮,单击“刷新”按钮,然后展开App_Data文件夹。

SDF_in_SolnExp

双击 Movies.sdf 打开 服务器资源管理器。 然后展开 “表” 文件夹以查看已在数据库中创建的表。

注意

如果双击 Movies.sdf 时收到错误,请确保已安装 SQL Server Compact 4.0(运行时 + 工具支持)。 (有关软件的链接,请参阅本教程系列第 1 部分中的先决条件列表。如果立即安装版本,则必须关闭并重新打开 Visual Web 开发人员。

DB_explorer

有两个表,一个用于 Movie 实体集,然后是表 EdmMetadata 。 实体 EdmMetadata 框架使用该表来确定模型和数据库何时不同步。

右键单击Movies该表,然后选择“显示表数据以查看所创建的数据。

MoviesTable

右键单击该 Movies 表,然后选择“ 编辑表架构”。

EditTableSchema

TableSchemaSM

请注意表的 Movies 架构如何映射到 Movie 之前创建的类。 Entity Framework Code First 根据 Movie 类自动创建此架构。

完成后,关闭连接。 (如果未关闭连接,则下次运行项目时可能会收到错误)。

CloseConnection

现在,你拥有数据库和一个简单的列表页,用于显示其中的内容。 在下一教程中,我们将检查基架代码的其余部分,并添加一个 SearchIndex 方法和 SearchIndex 视图,用于在此数据库中搜索电影。