Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现影片数据的功能。
在进行下步之前,点击“生成应用程序“对应用程序进行编译。
右键单击Controllers文件夹,新建一个名为“MoviesController ”的控制器。在创建窗口各选项如下图所示

点击添加,将创建以下文件和文件夹:

  • 项目的 Controllers 文件夹下新增MoviesController.cs文件
  • 项目的Views文件夹下新增Movies文件夹
  • 在Views/Movies文件夹下创建了Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml, 和 Index.cshtml 五个文件。

ASP.NET MVC 4为你自动生成CRUD(创建、读取、修改和删除)操作方法和视图(自动创建CURD操作方法和视图常被称为脚手架)。现在,你拥有了一个完整功能的web应用程序,可以显示影片列表和详细信息、创建影片、编辑影片和删除影片。

运行应用程序,在浏览器地址栏附加/Movies,访问Movies控制器。因为应用程序依赖默认路由(在Global.asax文件中定义),浏览器请求 http://localhost:xxxxx/Movies被路由到默认的Movies控制器的Index操作方法。换句话说,浏览器请求 http://localhost:xxxxx/Movies与请求http://localhost:xxxxx/Movies/Index的效果是相同的。因为你没有添加任何数据,所以当前影片列表是空的。

查看自动生成的代码

打开Controllers\MoviesController.cs文件,查看下生成的Index方法

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

MoviesController 类声明的下一行private MovieDBContext db = new MovieDBContext();是一个前面描述过的影片数据库上下文对象,你可以使用这个对象查询、编辑和删除影片。

影片控制器收到请求后,返回数据库影片表中所有实体并把结果传给Index视图。

强类型模型和@model关键字
在之前的教程中,学习过控制器如何通过ViewBag对象传递数据或对象给视图模板。ViewBag是一个动态对象,提供便利的晚绑定方式来传递信息给视图。ASP.NET MVC同时提供传递强类型数据或对象给视图模板的能力。强类型方式更有利于编译时检测代码和在Visual Studio编辑器中智能提示。Visual Studio的脚手架机制创建方法和视图时,采用这种方式来处理MoviesController类和视图模板。

查看下Controllers\MoviesController.cs文件中生成的Details方法。代码如下:

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

如果找到影片,则影片模型的实例传递给Detail视图。看一下Views\Movies\Details.cshtml 的文件内容。

通过在视图模板文件顶部引入@model MvcMovie.Models.Movie语句,你可以指定视图期望的对象类型。当你创建影片控制器时,Visual Studio自动在Details.cshtml文件顶部引入@model语句:

@model使你可以直接访问控制器传递给视图的强类型模型对象。例如,在 Details.cshtml 模板里,代码使用强类型对象传递影片的每个字段给HTML Helpers 的DisplayNameFor和DisplayFor方法。

Create和Edit方法及视图模板同样传递影片模型对象。

查看 Index.cshtml 视图模板和MoviesController.cs文件中的Index方法。注意在Index方法中,被视图Helper方法调用时,代码如何创建列表对象。

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

当你创建影片控制器时,Visual Studio在Index.cshtml文件顶部自动引入以下@model语句:@model IEnumerable<MvcMovie.Models.Movie>

@model 语句使你可以直接访问由控制器通过强类型对象传递过来的影片列表。例如,在Index.cshtml 模板里,代码通过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>
}

因为模型对象是强类型的( IEnumerable<Movie>对象),循环中的每个对象类型是Movie。这意味着编译时检测代码和代码编辑器中完全的智能提示。

使用Sql server 本地数据
译者注:在上面例子中你可能会奇怪,填写的影片信息究竟存放到哪里,内存吗?重启web,发现添加的信息仍能保存,说明不是内存,下面就来说一下此问题。
实体框架代码先行模式检测到指向影片数据库的连接字符串不存在,则会自动创建数据库。你可以通过查看App_Data文件夹来确认数据库已经被创建。如果你没看到数据库文件,在解决方案资源管理器工具栏点击“显示所有文件”按钮刷新按钮,然后展开App_Data文件夹,文件名一般为“MvcMovie.Models.MovieDbContext.mdf”,双击此文件,自动打开服务器资源管理器,展开“表”文件夹,会看到Movie表。

右键单击Movie表,选择“打开表定义”,查看实体框架代码先行为你创建的表结构

CREATE TABLE [dbo].[Movies] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Genra] NVARCHAR (MAX) NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Date] DATETIME NOT NULL,
CONSTRAINT [PK_dbo.Movies] PRIMARY KEY CLUSTERED ([ID] ASC)
);

注意Movie表如何映射到你之前创建的Movie类。实体框架代码先行基于你的Movie类自动创建表结构。结束查看,需要通过右键单击MvcMovie.Models.MovieDbContext,选择关闭连接。(如果不关闭连接,则下次运行项目时有可能出错)。

现在创建了数据库,并从中获取数据显示了简单列表。在下一节课程中,我们将查看其余的脚手架生成的代码并增加名为SearchIndex方法和视图用于查询数据库中影片信息。

译者注:如何不使用本地数据库,而是连接正式数据库呢?其实在原英文教程的上节结尾说明过,当时觉得提出太突兀,译者未在上节中翻译出,在此补充。

MovieDbContext负责连接数据库,映射影片对象到数据库记录。你可能会问一个问题,如何指定要连接哪个数据库?该工作是通过在应用程序的Web.config 文件里增加连接信息来实现的。
打开应用程序根目录下的Web.config文件(不是View文件夹下的Web.config文件),下面的例子展示了新的连接字符串被添加:

<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcMovie-2012213181139;Integrated Security=true"
providerName="System.Data.SqlClient"
/>
<add name="MovieDbContext"
connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True"
providerName="System.Data.SqlClient"
/>
</connectionStrings>

注意键值需要是MovieDbContext,与类名一致。

Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据的更多相关文章

  1. Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

    Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framewo ...

  2. Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图

    Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图 在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML ...

  3. Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

    Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程 ...

  4. 【译】ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据

    原文:[译]ASP.NET MVC 5 教程 - 6:通过控制器访问模型的数据 在本节中,你将新建一个MoviesController 类,并编写获取电影数据的代码,使用视图模板将数据展示在浏览器中. ...

  5. ASP.NET MVC4 新手入门教程之五 ---5.用控制器访问模型数据

    在本节中,将创建一个新的MoviesController类并编写代码来检索电影数据并将其显示在浏览器中使用一个视图模板. 才走出下一步生成应用程序. 用鼠标右键单击控制器文件夹中并创建一个新的 Mov ...

  6. 主攻ASP.NET MVC4.0之重生:上下滑动屏幕动态加载数据

                @{ ViewBag.Title = "Index"; } <!DOCTYPE html> <html> <head> ...

  7. 【译】ASP.NET MVC 5 官方教程 - 目录

    ASP.NET MVC 5 官方教程 - 目录 [译]ASP.NET MVC 5 教程 - 1:入门 [译]ASP.NET MVC 5 教程 - 2:添加控制器 [译]ASP.NET MVC 5 教程 ...

  8. 建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发

    框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性 ...

  9. 利用CSS预处理技术实现项目换肤功能(less css + asp.net mvc4.0 bundle)

    一.背景 在越来越重视用户体验的今天,换肤功能也慢慢被重视起来.一个web系统用户可以选择一个自己喜欢的系统主题,在用户眼里还是会多少加点分的.我们很开心的是easyui v1.3.4有自带defau ...

随机推荐

  1. Silverlight下的Socket通讯

    http://www.cnblogs.com/chengxingliang/archive/2012/05/24/2515100.html 在Silverlight中进行通讯,只能使用4502-453 ...

  2. [LeetCode][Python]Integer to Roman

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/integer ...

  3. Mac 域名解析

    1. 域名解析 如,解析 www.baidu.com 在终端输入, host www.baidu.com 题外话: 转载自:http://hoarn.blog.51cto.com/1642678/14 ...

  4. android基础5——使用资源

    Android会基于当前的硬件.设备和语言配置来为某个资源标识符选择最合适的值. 1.在代码中使用资源 使用静态类R来访问资源.R类是基于外部资源而生的类,并且是在项目编译的时候创建的.R的每一个子类 ...

  5. C#程序设计六大原则记录

    本文目的在于记录,方便以后的回顾 http://www.uml.org.cn/sjms/201211023.asp 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的 ...

  6. 3.一步一步学c#(三):对象和类型

    类和结构 类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法,. 结构与类的区别是它们在内存中的存储方式,访问方式(类是存储在堆(heap)上的引用类型),而结构是存储 ...

  7. 脚本化css

    html文档的视觉显示包含很多变量:字体.颜色.间距等.css标准列举了这些变量.我们称之为样式属性.css定义了这些属性以指定字体.颜色.外边距.边框.背景.图片.文本对齐方式.元素尺寸和元素位置. ...

  8. JavaScript之Ajax

    简介:AJax是在2005年被Adaptive Path的Jesse James Garrett发明的,用户概括异步加载页面内容的技术---说通俗点,Ajax就是实现局部页面通过JavaScript与 ...

  9. gdb 命令使用

    1.gdb -x command.txt 每次重复输入命令很麻烦,可以使用上面的命令,把命令输入进command.txt里面,然后直接就可以执行gdb. 2.list 2.1 list functio ...

  10. Spring学习之Jar包功能介绍(转)

    spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ...