欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC4入门教程(五):从控制器访问数据模型

程序员文章站 2023-12-16 18:39:46
在本节中,您将创建一个新的moviescontroller类,并在这个controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里。 在开始下一步前...

在本节中,您将创建一个新的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视图,使您可以在数据库中搜索电影了。

上一篇:

下一篇: