Intro to ASP.NET MVC 4 with Visual Studio [译六:从控制器中访问模型的数据]

作者:Rick Anderson and Scott Hanselman

译者:PeterZhang

原文: http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

注: 边读编译,如有不准确之处,请予以纠正,谢谢!!!

-----------------------------------------------------------------------------------------------------------------

     在本部分,将创建一个新的MoviesController类,并编写检索movie数据和使用视图模板在浏览器中显示movie的代码。

     在进行下一步之前编译应用程序。

     右键Controller文件夹,然后创建一个新的MoviesController控制器。在编译应用程序前,下面的选项不会出现。选择下面的选项:

  • 控制器名称:MoviesController.(这个是默认值。)
  • 模板:MVC Controller with read/write actions and views,using Entity Framework。
  • 模型类:Movie(MvcMovie.Models)。
  • Data context 类:MovieDBContext (MvcMovie.Models)。
  • Views:Razor(CSHTML)。(默认。)

     点击Add。Visual Studio Express 创建如下文件和文件夹:

  • 项目中 Controller 文件夹下的 MoviesController.cs 文件。
  • 项目中 View 文件夹下的 Movies 文件夹。
  • 新文件夹 Views\Movies 下 Create.cshtml,Delete.cshtml,Details.cshtml,Edit.cshtml 和 Index.cshtml。

     ASP.NET MVC 4 自动创建 CRUD(create,read,update和delete)action 方法和视图(CRUD action 方法和视图的自动创建被称为 scaffolding)。现在有了一个完整功能的Web应用程序,可以创建、罗列、编辑和删除 movie。

     运行程序,通过在浏览器地址栏中附加 /Movie 浏览至 Movies 控制器。因为这个应用程序依赖默认的路由(定义在Global.asax文件中),http://localhost:xxxx/Movies请求 被路由到 Movie 控制器默认的 Index action 方法。换句话说,浏览器请求 http://localhost:xxxx/Movies 等同于浏览器请求http://localhost:xxxx/Movies/Index。结果是一个空的 Movie 列表,因为还没有添加 movie。

创建一个Movie

     选择 Create New 链接。输入一个 movie 详细信息,然后点击 Create 按钮。

     点击 Create 按钮使 form 被发送(post)到服务器,movie 信息被保存到数据库。然后被重定向到 URL /Movies,这里可以在列表中看到新创建的 movie。

     创建更多的 movie。尝试具有功能的 Edit,Details 和 Delete 链接。

检查生成的代码

     打开 Controllers\MoviesController 文件,检查生成的 Index 方法,movie 控制器中 Index 方法的部分代码显示如下。

public class MoviesController : Controller 
{ 
    private MovieDBContext db = new MovieDBContext(); 
 
    // 
    // GET: /Movies/ 
 
    public ActionResult Index() 
    { 
        return View(db.Movies.ToList()); 
    }

     下面的 MovieController 类中的代码实例化一个 movie 数据库上下文实例,如之前描述。你可以使用数据库上下文来查询,编辑和删除 movies。

private MovieDBContext db = new MovieDBContext();

     Movies 控制器的请求会返回 movie 数据库中 Movies 表中的所有数据,然后将结果传递给 Index 视图。

强类型模型和@model关键字

     本教程早期,看到了控制器如何通过 ViewBag 对象传递数据或对象到视图模板。ViewBag 是动态类型,提供一种方便的延迟绑定方式来传递信息到视图。

     ASP.NET MVC 也可以传递强类型数据或对象到视图模板。强类型方式能更好的编译时检查代码和 Visual Studio 里更丰富的智能提示。Visual Studio 中的scaffolding 机制创建 MoviesController 类和视图模板。

     在 Controllers\MoviesController.cs 文件中,检查自动生成的 Details 方法。有 Details 方法的 movie 控制器部分代码显示如下。

public ActionResult Details(int id = 0) 
{ 
    Movie movie = db.Movies.Find(id); 
    if (movie == null) 
    { 
        return HttpNotFound(); 
    } 
    return View(movie); 
}

     如果查找到 movie,Movie 模型的一个实例被传递给 Details 视图。检查 Views\Movies\Details.cshtml 文件的内容。

     通过在视图模板文件的顶部添加一个 @model 语句,指定视图期望的对象的类型。当你创建 movie 控制器时,在 Details.cshtml 文件顶部,Visual Studio 自动包含下面的 @model 语句:

@model MvcMovie.Models.Movie

     @model 指令允许通过强类型Model对象访问控制器传递给视图的 movie。例如,在 Details.cshtml 模板中,代码通过强类型Model对象传递 movie 的每一个字段给HTML Helper的 DisplayNameFor 和 DisplayFor。Create 和 Edit 方法以及视图模板也传递 movie model 对象。

     查看 Index.cshtml 视图模板和 MoviesController.cs 文件中的 Index 方法。注意当在 Index action 方法中调用 View helper 方法时,代码如何创建一个对象列表。然后从控制器传递 Movie 列表到视图:

public ActionResult Index() 
{ 
    return View(db.Movies.ToList()); 
}

     当你创建 movie 控制器时,在 Index.cshtml 文件顶部,Visual Studio Express 自动包含下面的 @model 语句:

@model IEnumerable<MvcMovie.Models.Movie>

     @model 指令允许访问 控制器通过强类型 Model 对象传递给视图的 movie 列表。例如,在index.cshtml 模板中,代码通过在强类型 Model 对象上的 foreach 语句循环遍历 movies:

@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 检查指向 Movie 数据的数据库连接字符串不存在,所以 Code First 自动创建数据库。可以通过查看 App_Data 文件夹确认数据库创建了。如果没有看到 Movies.mdf 文件,点击 Solution Explorer 工具栏上的 “Show All Files” 按钮,然后展开 App_Data 文件夹。

 

 双击 Moves.mdf 打开 DATABASE EXPLORER,然后展开 Tables 文件夹查看 Movies 表。

 

注意:如果没有database explorer,在TOOLS菜单中,选择Connect to Database,然后取消Choose Data Source对话框。这会强制打开database explorer。
注意:如果你正在使用VWD或者Visual Studio 2010,看到一个类似如下情况的错误:
•The database 'C:\Webs\MVC4\MVCMOVIE\MVCMOVIE\APP_DATA\MOVIES.MDF' 
cannot be opened because it is version 706. This server supports version 655 and earlier. A downgrade path is not supported. •"InvalidOperation Exception was unhandled by user code" The supplied SqlConnection does not specify an initial catalog. 需要安装SQL Server Data Tools和LocalDB。在前面的页面上检查MovieDBContext连接字符串。

     右键 Movie 表,选择 “Show Table Data” 查看创建的数据。

     右键 Movie 表,选择 “Open Table Definition” 查看 Entity Framework 的 Code First 创建的表结构。

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

     当完成时,通过右键 MovieDBContext 选择 “Close Connection”  关闭连接。(如果不关闭连接,下次运行项目时可能会获得错误。)

     现在已经有了数据库和显示数据库中内容的简单列表页面。在下面的教程中,将会检查 scaffolded 代码的其他部分,然后添加一个 SearchIndex 方法,再添加一个可以搜索数据库中 movie 的 SearchIndex 视图。

posted on 2013-02-03 21:31  PeterZhang  阅读(1621)  评论(0编辑  收藏  举报