asp.net mvc5官方教程


ASP.NET MVC5 教程 译文链接:http://www.cnblogs.com/DoduNet/p/3234076.html 原文链接:http://www.asp.net/mvc/tutorials/mvc-5/introduction/ QQ 群:25380362 整理 目录 1:入门........................................................................................................1 2:添加控制器........................................................................................... 6 3:添加视图............................................................................................. 15 4:添加模型............................................................................................. 30 5:使用 SQL Server LocalDB 创建连接字符串.................................. 34 6:通过控制器访问模型的数据.............................................................37 7:Edit 方法和 Edit 视图详解............................................................... 48 8:搜索查询............................................................................................. 64 9:添加新字段......................................................................................... 72 10:添加验证........................................................................................... 87 11:Details 和 Delete 方法详解.........................................................101 1 1:入门 本教程将教你使用 Visual Studio 2013 预览版构建 ASP.NETMVC 5 Web 应用程序 的 基础知识。本主题还附带了一个采用 C# 源代码的 Visual Web Developer 项目。下载 C# 版本。 入门 Visual Studio 是一个集成的开发环境。就像您使用 Microsoft Word 写文档,您将使用 IDE 创建的应用程序。Visual Studio 的顶部有一个工具栏,其中显示了你可以使用的不 同选项。还有一个菜单,提供了另一种在 IDE 中执行任务的方法。(例如,可以从起始页 选择新的项目,或者使用菜单 选择 文件>新建项目.) 创建您的第一个应用程序 您可以创建使用 Visual Basic 或 Visual C# 作为编程语言的应用程序。单击新建项目, 然后在左边选择 Visual C#,然后 WEB,然后选择 ASP.NET Web 应用程序。驾驶您使 2 用的项目名称为:"MvcMovie",然后单击确定。 在新的 ASP.NET 项目对话框中,单击 MVC,然后单击创建项目。 3 单击确定。会得到使用 Visual Studio 默认模板的 ASP.NETMVC 项目,这是一个简单 的“Hello World!”项目,是你开发应用程序的一个好的开始。 按 F5 启动调试。F5 导致 Visual Studio 启动 IIS Express 并运行您的 web 应用程 序。Visual Studio 启动浏览器,然后打开该应用程序的主页。注意浏览器的地址栏显示的 是 localhost,而不是类似于 example.com 这样的地址。这是因为 localhost 始终指向 4 您自己的本地计算机,在这种情况下你只是生成的应用程序运行。当 Visual Studio 运行 时 web 项目中,会使用服务器的一个随机端口用于 此 web 应用。在下面的图像中,端 口号是 1234。当您运行该应用程序时,您就会看到一个不同的端口号。 此默认模板直接为您提供了主页、 联系人和关于页面。上面的图片不能显示首页,以及联 系人的链接。根据您的浏览器窗口的大小,您可能需要单击导航图标,看到这些链接。 5 应用程序还提供注册、登录的示例。 6 2:添加控制器 MVC 表示 模型-视图-控制器。MVC 是一种用于开发应用程序的模式,具备良好架构,可 测试和易于维护。基于 MVC 应用程序中包含:  Models: 表示应用程序的数据,并使用验证逻辑强制执行业务规则的数据的类。  Views: 您的应用程序用来动态生成 HTML 响应的模板文件。  Controllers: 处理传入的请求的浏览器,类检索模型的数据,然后指定将响应返回 到浏览器中的视图模板。 在这个系列教程中涵盖了所有这些概念和教你怎么使用它们构建应用程序。 让我们开始创建一个控制器类。在 解决方案资源管理器中,右键单击 Controllers 文件夹, 然后单击 添加,然后支架。 添加支架对话框中,单击 MVC 5 控制器-空,然后单击添加。 7 注意在 解决方案资源管理器 已创建的新文件命名 HelloWorldController.cs。在 IDE 中打开该文件。 8 写入下面的代码: using System.Web; using System.Web.Mvc; namespace MvcMovie.Controllers { public class HelloWorldController : Controller { //GET:/HelloWorld/ public string Index() { return "This is my default action..."; } 9 //GET:/HelloWorld/Welcome/ public string Welcome() { return "This is the Welcome action method..."; } } } 示例中,控制器的类名为 HelloWorldController,继承于:Controller,上述第一种 方法为 Index。让我们从浏览器中调用它。 运行该应用程序 (按 F5 或 Ctrl + F5)。在浏览器中,将"HelloWorld"添加到地址 栏上的路径后面 。(例如,在图中,它下面的 http://localhost:1234/HelloWorld.) 页面在浏览器中的将看到如下图所示的页面。在上述方法中,代码直接返回一个字符串。 ASP.NETMVC 会根据传入的 URL 调用不同的控制器类(以及其中的不同操作方法)。 ASP.NETMVC 所使用的默认 URL 路由逻辑使用这样的格式来确定哪些代码来调用: /[Controller]/[ActionName]/[Parameters] 在 App_Start/RouteConfig.cs 文件中可以设置路由的格式。 public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", 10 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );} 当您运行该应用程序并不提供任何 URL 部分时,它将默认的"Home"的控制器和上面 代码的默认值部分中指定的"Index"的操作方法。 URL 的第一部分确定要执行的控制器类。所以 /HelloWorld 映 射 到 HelloWorldController 类。第二部分 URL 的确定要执行的类上的操作方法。所以 /HelloWorld/Index 会找到 HelloWorldController 类的 Index 的方法执行。请注 意,我们只在浏览器中看到 /HelloWorld,而并无 Index 。这是因为命名 Index 的 方法被指定一个称为控制器的默认方法。URL 段 ( Parameters) 的第三部分是用于路 由数据。我们将在本教程中稍后看到路由配置的资料。 下面在浏览中打开 http://localhost:xxxx/HelloWorld/Welcome。 Welcome 方 法 运 行 , 并 返 回 字 符 串 "This is my default action..." 。MVC 的 默 认 映 射 是 /[Controller]/[ActionName]/[Parameters] 。 对 于 这 个 URL, 控 制 器 是 HelloWorld,而 Welcome 是操作方法。您还没有使用 URL 的 [Parameters] 部分。 让我们将此示例稍微修改一下,以便您可以将一些参数信息从 URL 中传递给控制器 (例如,/HelloWorld/Welcome?name=Scott&numtimes=4)。更改您 Welcome 方 法,包括两个参数,如下所示。请注意,该代码使用 C# 的可选参数功能来指示:当没有 为 numTimes 参数传递值时,该参数的默认值应为 1。 public string Welcome(string name, int numTimes = 1){ return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes); } 运行您的应用程序,然后在浏览中打开 URL: http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4 11 在 URL 中您可以尝试不同的值 name 和 numtimes 。在 ASP.NETMVC 模型绑 定系统 从地址栏中命名的参数将自动映射给您的方法中指定的参数。 在上面的示例中,不使用 URL 段( Parameters),作为查询字符串传递的 name 和 numTimes 参数。 Welcome 方法替换为以下代码: public string Welcome(string name, int ID = 1) { return HttpUtility.HtmlEncode("Hello " + name + ",ID:" + ID); } 运行应用程序,然后输入以下 URL: http://localhost:xxx/HelloWorld/Welcome/3?name=Rick 这次 URL 的第三个部分匹配 ID,因为 Welcome 的操作方法有一个匹配的 URL 规 范在 RegisterRoutes 方法中的参数 (ID)。 public static void RegisterRoutes(RouteCollection routes){ 12 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );} 在 ASP.NETMVC 应用程序中,这是默认的路由配置 (像刚才那样用 ID)。您也可以 添加一个路由,这两个 name 传递给 和 numtimes 作为路由数据的 URL 中的参数。在 App_Start\RouteConfig.cs 文件中,添加"Hello"的路由配置: public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute( name: "Hello", url: "{controller}/{action}/{name}/{id}" ); } } 在浏览器中打开 /localhost:XXX/HelloWorld/Welcome/Scott/3. 13 对于许多的 MVC 应用程序都默认路由来正常工作。稍后在本教程中,通过使用模型 程序,数据,您将了解到,所以一般不必修改默认路由。 3:添加视图 在本节内容中,我们将修改 HelloWorldController 类,使用视图模板来干净利索的封 装生成 HTML 响应客户端的过程。 您将创建一个使用 Razor 视图引擎的视图模板文件。.cshtml 扩展名的文件都是基于 razor 视图模板文件,Razor 视图引擎将编写视图模板所需的代码降至最低。 目前的 Index 方法返回一条消息,是在控制器类中直接写入的字符串。更改 Index 方法使其返回一个 View 对象,如以下代码所示: publicActionResult Index() { returnView(); } 上面的 Index 方法使用一个视图模板来生成浏览器所需的 HTML 代码。控制器方法 (也称为操作方法),如上述,Index 方法通常返回的 ActionResult(或从 ActionResult 派生的类),但他不像是基元类型的字符串。 首先,对 HelloWorld 控制器创建一个视图文件夹。右键单击“View”,单击添加,然 后单击新建文件夹。 14 右键单击 HelloWorld 文件夹并单击添加,然后单击支架。 15 添加支架对话框中,单击5 视图 MVC-空无模型。然后单击添加。 在添加视图对话框中,命名视图 Index 和保留的其他设置的默认值,然后单击添加。 创建的 MvcMovie\Views\HelloWorld\Index.cshtml 文件。 16 下面显示所创建的 Index.cshtml 文件: 添加下面的 html 代码

标记下。 17

Hello from our View Template!

下面是一个完整的 MvcMovie\Views\HelloWorld\Index.cshtml 文件。 @{ ViewBag.Title = "Index"; }

Index

Hello from our View Template!

右键单击 Index.cshtml 文件,然后选择 View in Page Inspector. 请参见教程页面检查器的详细信息。 另外,运行程序,浏览到 HelloWorld 控制器(http://localhost:xxxx/HelloWorld)。 控制器中的 Index 方法并没有做太多工作,它只是简单的运行了语句 return View(),指 定 Index 方法应该使用一个视图模板文件呈现到浏览器的响应。 因为你没有明确指定要使用的视图模板文件的名称,ASP.NETMVC 默认使用 \Views\HelloWorld 文件夹下的 Index.cshtml 文件。下面图片中显示的“Hello from our View Template!”硬编码在视图中。 18 看起来还不错。但是,注意浏览器标题栏显示的“Index - My ASP.NET Ap”和在页面 顶部的大个儿的“Application name”链接。根据你窗口大小不同,你可能会看到右上角的 三条杠,点击后会看到 Home、About、Contact、Register 和 Log in 链接。 更改视图和布局页面 首先,你希望改变页面顶部的“Application name”链接,这段文字在每个页面都有, 是公用的。尽管它出现在程序中的每个页面,但实际上它只写在一个地方。在解决方案资源 管理器中找到 /Views/Shared 文件夹,打开_Layout.cshtml 文件。这个页面叫做布局 页,放在所有页面都能用的共享文件夹中。 19 布局模板允许你在页面的某个地方指定 HTML 容器,然后在网站多个页面中应用。找 到@RenderBody() 行,RenderBody 是一个占位符,所有你使用了_layout.cshtml 文 件的视图页面会被显示在这个地方,“包装”在布局页中。 例如,如果你选择 About 链接,视图 Views\Home\About.cshtml 将被绘制在 RenderBody 方法中。 修改布局模板中的 ActionLink,将"Application name"改为"MVC Movie"。 20 用下面的标签替换 title 元素的内容: @ViewBag.Title - Movie App @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") 运行应用程序,现在已将变成“MVC Movie”了。单击 About 链接,你会看到这个页面 也显示“MVC Movie”。我们仅仅修改了布局模板,就为网站中的所有页面换上了新的标题。 21 现在让我们来改变 Index 视图中的 title 吧。 打开 MvcMovie\Views\HelloWorld\Index.cshtml 。有两个地方需要我们修改:浏 览器标题栏中的文本,然后是次要的标题(

元素)。你可以稍微修改一下代码,这样 就可以看到哪些代码影响了哪些部分。 @{ ViewBag.Title = "Movie List"; }

My Movie List

Hello from our View Template!

为了指明 HTML 显示的标题,上面的代码中设置了 ViewBag 对象(在 Index.cshtml 视图模板中)的 Title 属性。在布局模板中(Views\Shared\_Layout.cshtml )的 节点的标签使用了这个值。 <!DOCTYPE html> <html> 22 <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title - Movie App @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") 使用此 ViewBag 的方法,你可以轻松地其他参数之间传递您的视图模板和布局文件。 运行应用程序并浏览到 http://localhost:xx/HelloWorld。注意这个页面发生的变化: 浏览器标题、主标题、此标题都发生了改变(如果你没有看到这些变化,可能是浏览器缓存 了之前的内容,在浏览器中按 CTRL+F5强制从刷新页面)。 浏览器标题使我们在 Index.cshtml 中传递给布局页的参数,布局页又加上了“- Movie App”部分。通过这个例子你会看到,布局模板提供了一种简单的修改应用程序中全部页面 的方式。 到目前为止,我们用到的少量数据(像上面例子中的 “Hello from our View Template!”)都是硬编码的。我们用到了 MVC 中的“V”(View)和“C”(Controller), 但还没用到过“M”(Model)。 接下来我们就演练一下如何创建数据库,并通过模型来获取数据。 23 将数据从控制器传递到视图 在讨论数据库和模型之前,让我们先说说容控制器传递数据给视图。控制器类在响应传 入的请求时被调用,控制器类是你写代码处理浏览器请求、从数据库中检索数据、并最终决 定发送什么类型的响应给浏览器。视图模板被控制器用来生成和格式化 HTML 响应给浏览 器。 控制器的责任是为视图模板提供必须的数据或对象,用来绘制 HTML 响应浏览器。一 个最佳实践是:视图模板从来不参与业务逻辑,或直接与数据库交互。相反的,视图模板仅 与控制器提供的数据一起工作。保持这种“关注点分离(separation of concerns)”有助 于保持代码的整洁,可测试性和更容易维护。 目前,HelloWorldController 类中的 Welcome 方法需要两个参数:name 和 numTimes,然后直接与将值输出给浏览器。让我们修改控制器,使用视图来替换直接相 应 string 字符串。视图模板会生成一个动态响应,这意味着你需要通过控制器传递一些数 据用来生成响应。 要做到这些,你需要通过在控制器中将数据(参数)放到 ViewBag 对象中,视图可以 访问 ViewBag 对象。 回到 HelloWorldController.cs 文件中,修改 Welcome 方法,在 ViewBag 对象 中添加一个 Message 和 NumTimes 值。ViewBag 是 dynamic 类型的对象,你可以为 它添加任何你想要的数据,ViewBag 对象在你添加数据之前,不具有任何属性。 ASP.NETMVC 模型绑定系统从地址参数中自动映射命名的参数( name 和 numTimes)到方法中。完整的 HelloWorldController.cs 文件如下: using System.Web; using System.Web.Mvc; namespace MvcMovie.Controllers { public class HelloWorldController : Controller { public ActionResult Index() { return View(); } public ActionResult Welcome(string name, int numTimes = 1) { ViewBag.Message = "Hello " + name; ViewBag.NumTimes = numTimes; return View(); }}} 24 现在 ViewBag 对象已经包含了数据,它会被自动传递给视图。 接下来,你需要一个 Welcome 视图模板。在生成菜单中,选择生成解决方案(或使用 快捷键 CTRL+SHIFT+B)确定项目已经编译了。 在 Views\HelloWorld 文件夹右键,选择“添加”>“支架”: 在添加支架对话框中,选择“MVC 5 View - Empty without model”。 25 在 Add View 对话框中,将视图命名为 Welcome 文件 MvcMovie\Views\HelloWorld\Welcome.cshtml 已经创建好了。 在文件 Welcome.cshtml 的

元素下添加如下的代码,完整的代码如下: @{ ViewBag.Title = "Welcome"; }

Welcome

    26 @for (int i = 0; i < ViewBag.NumTimes; i++) {
  • @ViewBag.Message
  • }
运行应用程序,在浏览器中查看如下地址: http://localhost:xx/HelloWorld/Welcome?name=Scott&numtimes=4 现在数据从 URL 取出来,通过模型绑定传递给控制器,控制器将数据封装在 ViewBag 对象中,传递给视图,然后视图将数据以 HTML 的方式呈现给用户。 在上面的例子中,我们使用 ViewBag 对象将数据从控制器传递给视图。在家下来的章 节中,我们会使用视图模型来传递数据。使用视图模型传递数据比用 ViewBag 要好得多。 这也是模型“M”的一种,但并没有使用数据库。我们接下来要学习的是创建一个数据库, 创建一个真正意义的视图模型。 4:添加模型 在本节中,我们将添加一些管理电影数据库的类,这些类在 ASP.NETMVC 应用程序 中扮演“Model”的角色。 我们将使用.NET Framework 平台上熟知的 Entity Framework 数据访问技术来定 27 义和使用这些模型。Entity Framework(简称 EF)提供了一种叫做 Code First 的开发 范例。 Code First 允许你写一些简单的类来创建模型(这些通常被称为 POCO 类,即“plain old CLR object”)。这些类将会生成数据库,这是一种即简洁又快速的开发流程。 添加 Model 类 在解决方案资源管理器中,右键 Models 文件夹,选择 "添加">"类"。 输入类名“Movie”。为 Movie 类添加一下5个属性,完整的 Movie 类代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcMovie.Models { public class Movie { public int ID{ get; set;} 28 public string Title { get; set;} public DateTime ReleaseDate { get; set;} public string Genre { get; set;} public decimal Price { get; set;} } } 我们将使用 Movie 类代表数据库中的电影。每一个 Movie 对象将对应数据表中的一行, Movie 类的每一个字段映射数据表中的每一列。 在上面的文件中,添加一个 MovieDBContext 类: using System; using System.Data.Entity; namespace MvcMovie.Models { public class Movie { public int ID{ get; set;} public string Title { get; set;} public DateTime ReleaseDate { get; set;} public string Genre { get; set;} public decimal Price { get; set;} } public class MovieDBContext : DbContext { public DbSet Movies { get; set;} } } MovieDBContext 类代表了 Entity Framework 中 Movie 类的数据库上下文,用 来处理获取、存储和更新数据库中的 Movie 类的实例。MovieDBContext 类继承自 Entity Framework 中提供的 DbContext 类。 为了能够引用 DbContext 和 DbSet,你需要添加 System.Data.Entity 的引用,代 码如下: using System.Data.Entity; 你可以手动添加 using 语句,或者在红色波浪线上面右键,选择“解析”>"using System.Data.Entity;"。 29 注意:一些没用到的 using 语句已经被移除了。你可以在文件中右键,选择“组织 using”>“移除未使用的 using”,移除未用到的 using 语句。 30 我们终于添加了一个模型(MVC 中的 M)。在下一节中,我们将讲解使用数据库连接 字符串。 5:使用 SQL Server LocalDB 创建连接字符串 在上一节中,我们创建了 MovieDBContext 类来连接数据库、处理 Movie 对象和数据库 记录的映射。你可能会问我们到底使用了哪个数据库?其实,在我们没有指定数据库的时候, Entity Framework 默认使用 LocalDB 。 在本节中我们将介绍如何在 Web.config 文件中添加一个数据库连接。 SQL Server Express LocalDB LocalDB 是 SQL Server Express 数据库引擎的轻量级版本,LocalDB 运行在 SQL Server Express 的特殊执行模式下,允许你使用数据库文件(例如 .mdf 文件)。通常情况下, LocalDB 数据库文件放在解决方案的 App_Data 文件夹下。 SQL Server Express 是不推荐用在 web 应用程序产品中的,其实准确的说,LocalDB 也 不能用在 web 应用程序产品中,因为它设计的时候就没考虑和 IIS 一起使用。然而,一个 LocalDB 数据库可以很简单的迁移到 SQL Server 或 SQL Azure。 31 在 Visual Studio 2013(或 2012)中,Visual Studio 默认安装了 LocalDB。 默认情况下,Entity Framework 会查找和对象上下文类同名的数据库连接(在这个项目 中是 MovieDBContext)。 打开应用程序根目录的 Web.config 文件(不是在 Views 目录中的 Web.config)。文件 位置如下图: 打开文件后,找到 connectionString 节点: 32 在 connectionString 节点下面添加如下连接字符串: 下面是添加了 MovieDBContext 连接字符串后完整的 connectionString 节点代码: 这两个连接字符串很相似,第一个的名字是 DefaultConnection,是 membership 用来控 制谁访问应用程序的数据库。我们添加的连接字符串指定了 LocalDB 数据库名字是 Movie.mdf ,放在 App_Data 文件夹。在我们的教程中没有用到 membership 数据库,关于 membership、authentication 和 security,我们会在以后的教程中进行介绍。 数据库连接字符串的名字必须和 DbContext 类同名。 using System; using System.Data.Entity; namespace MvcMovie.Models { public class Movie { public int ID{ get; set;} public string Title { get; set;} public DateTime ReleaseDate { get; set;} public string Genre { get; set;} public decimal Price { get; set;} } public class MovieDBContext : DbContext { public DbSet Movies { get; set;} } } 事实上,你不需要添加 MovieDBContext 连接字符串,如果你没有明确指定连接字符 33 串,Entity Framework 会在用户目录创建一个 LocalDB 数据库,名字就是 DbContext 类的 全名(在本示例中文件名是 MvcMovie.Models.MovieDBContext)。你可以为数据库指定任 何你喜欢的名字,只要它有 MDF 后缀就行,例如,我们可以用 MyFilms.mdf 来命名。 接下来,我们要创建一个新的 MoviesController 类,用来显示电影数据和让用户来创 建新的电影列表。 6:通过控制器访问模型的数据 在本节中,你将新建一个 MoviesController 类,并编写获取电影数据的代码,使用 视图模板将数据展示在浏览器中。 在进行下一步之前,你需要先编译应用程序,否则在添加控制器的时候会出错。 在解决方法资源管理器的 Controllers 文件夹右键,选择"添加">"支架": 在“添加支架”对话框,选择 MVC 5 Controller with read/write actions and views, using Entity Framework,然后单击“添加”按钮。 34 在 Controller name 输入框中输入 MoviesController。在 Model class 选择列表中, 选 择 Movie (MvcMovie.Models) 。 在 Data context class 选 择 列 表 中 , 选 择 MovieDBContext(MvcMovie.Models) 。 其它几个选项保持默认值,完整的截图如下: 35 在点击“Add”按钮之后(如果你遇到错误,很有可能是因为你没有编译项目),Visual Studio 会创建如下文件和文件夹:  在 Controllers 文件夹中创建了 MoviesController.cs 文件  在 Views 文件夹中创建了 Movies 文件夹  在 Views\Movies 文 件 夹 中 创 建 了 Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml, 和 Index.cshtml 视图文件。 ASP.NETMVC 5 自动创建了 CRUD(create, read, update, delete)操作方法, 并为他们创建好了视图。 你现在已经有了一个拥有完整功能的应用程序,你可以使用它来创建、列表显示、编辑 36 和删除电影了。 运行应用程序,在浏览器中查看地址 http://localhost:xxxxx/Movies 。因为程序 依赖默认的路由,所以浏览器请求的地址分配给 MoviesController 的 Index 方法。 换 句 话 说 , 浏 览 器 请 求 http://localhost:xxxxx/Movies 地 址 等 同 于 请 求 http://localhost:xxxxx/Movies/Index 地址。浏览器中显示一个空的电影列表,因为我 们目前还没有添加。 添加电影 选择 “Create New”链接,在打开的页面中输入一些电影信息,然后点击“Create”按钮: 37 点击“Create”按钮会将数据提交到服务器,服务器将电影信息出入数据库。再次查看 /Movies 地址,在列表中就能看到我们新添加的电影了。 创建更多的电影记录,然后试试编辑、详细信息和删除功能。 生成的代码详解 打开文件 Controllers\MoviesController,检查生成的 Index 方法。MoviesController 的包含 Index 方法的部分代码如下: public class MoviesController : Controller { private MovieDBContext db = new MovieDBContext(); // public ActionResult Index() { return View(db.Movies.ToList()); } 在 MovieController 类中,包含了 MovieDBContext 类的实例,你可以使用它进行 查询、编辑和删除电影。 38 MoviesController 的 Index 方法将返回所有数据库中的电影数据,然后将结果传递 给 Index 视图。 强类型模型和@model 关键字 在之前的章节中,我们已经介绍了如果使用 ViewBag 将数据从控制器传递给视图。 ViewBag 是一个动态对象,提供了一个便捷的后期绑定的方式将数据传递给视图。 ASP.NETMVC 同样提供了传递强类型数据或对象到视图的功能。这种强类型的方式 提供了更好的编译时检查和更丰富的智能感知,Visual Studio 中的脚手架机制在创建 MoviesController 类和视图的时候使用了这种方式。 检查 Controllers\MoviesController.cs 文件中的 Details 方法,下面是 Detais 方 法的部分代码: public ActionResult Details(Int32 id) { Movie movie = db.Movie.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); } 参数 id 通常会作为路由数据传递给控制器,例如: http://localhost:1234/movies/details/1 将会设置控制器为 MoviesController,操作为 Details,参数 id 为1。你还可以通 过查询字符串传递 id: http://localhost:1234/movies/details?id=1 如果找到了电影信息,一个电影的模型就会传递给 Details 视 图 。 检 查 一 下 Views\Movies\Details.cshtml 文件的内容。 通过文件顶部的@model 语句,你就知道这个视图所期望的什么类型的对象。当你创 建了电影控制器,Visual Studio 将会自动在 Details.cshtml 文件顶部包含如下语句: @model MvcMovie.Models.Movie @model 指令允许使用强类型 Model 对象访问从 Controller 传递给 View 的电 影对象(注意,此时的 Model 对象是 Movie 类型)。例如,在 Details.cshtml 模板中, 代码将 Movie 的每一个字段通过强类型的 Model 对象传递给 DisplayNameFor 和 DisplayFor HTML 帮助方法。Create 和 Edit 方法也传递了一个 Model 给视图,此处不 再多讲。 39 检查 Index.cshtml 模板和 MoviesController.cs 文件的 Index 方法,程序先创建 好一个电影模型的列表对象,然后将创建好的列表对象通过 View 方法传递给视图: public ActionResult Index() { return View(db.Movie.ToList()); } Visual Studio 自动在 Index.cshtml 文件顶部添加了@model 语句: @model IEnumerable @model 指令允许使用强类型 Model 对象访问从 Controller 传递给 View 的电 影列表对象(注意,此时的 Model 对象是 IEnumerable 类型)。例如,在 Index.cshtml 模板中,代码通过 foreach 语句循环强类型 Model 中的每个电影对象。 @foreach (var item in Model){ @Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) } 因为 Model 对象是强类型(IEnumerable),每个循环中的 item 对象都 是 Movie 类型的。这意味着你的代码具有更好的编译时检查和完整的智能感知支持: 使用 SQL 服务器 LocalDB Entity Framework Code First 检查连接字符串使用的数据库是否存在,如果不存在,则 会自动创建数据库文件。你可以在 App_Data 文件夹下查看数据库是否被创建(如果你没 有看到 Movies.mdf 文件,点击解决方案资源管理器工具栏上的“显示所有文件”按钮,单 击“刷新”按钮,然后展开 App_Data 文件夹)。 40 双击 Movies.mdf 文件,打开服务器资源管理器,然后展开 Tables 目录查看 Movies 数据表。 右键 Movies 表,选择“显示表数据”查看我们创建的电影数据。 41 右键 Movies 表,选择“打开表定义”,查看 Entity Framework Code First 为我们 创建的表结构。 42 Entity Framework Code First 根据我们 Movie 类自动创建了表结构,包括字段名 和数据类型。 当我们结束查看或编辑数据库之后,要在服务器资源管理器中关闭连接,右键 MovieDBContext,选择“关闭连接”。(如果你不关闭连接,下一次运行程序的时候可能会 出现错误) 现在我们已经有了数据库和简单的几个页面来显示数据,在接下来的章节中,我们将研 究其它支架生成的代码,并添加一个 SearchIndex 方法和 SearchIndex 视图,用来查找 数据库中的电影。 7:Edit 方法和 Edit 视图详解 在本节中,我们继续研究生成的 Edit 方法和视图。但在研究之前,我们先将 release date 弄得好看一点。打开 Models\Movie.cs 文件,添加下面黄色背景的行: using System; using System.ComponentModel.DataAnnotations; using System.Data.Entity; 43 namespace MvcMovie.Models { public class Movie { public int ID{ get; set;} public string Title { get; set;} [Display(Name="Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set;} public string Genre { get; set;} public decimal Price { get; set;} } public class MovieDBContext : DbContext { public DbSet Movies { get; set;} } } 我们将在下一节中介绍 DataAnnotations。Display 特性指定了显示的字段名(本例 中“Release Date”替换了“ReleaseDate”)。DataType 特性指定了数据类型,在本例中 它是日期类型,因此存储在该字段的时间信息将不会显示出来。 运行应用程序,在浏览器地址栏中追加/movies 来访问 Movies 控制器。将鼠标放在 Edit 链接上面,查看它链接到的地址: 44 Edit 链接是通过 Html.ActionLink 方法生成的,在 Views\Movies\Index.cshtml 视图中,代码如下: @Html.ActionLink("Edit","Edit", new { id=item.ID }) Html 对象是 System.Web.Mvc.WebViewPage 基类中的一个属性,ActionLink 方法使动态生成 控制器中方法的 HTML 超链接更为简单。ActionLink 方法的第一个参数 是要显示的链接文字(例如Edit Me);第二个参数是要调用的控制器方法(在 这里是 Edit 方法);最后一个参数是生成路由数据用的匿名对象(在这里是 id,值为1)。 在图1中显示的生成地址是 http://localhost:2264/Movies/Edit/1 。默认的路由匹 配 {controller}/{action}/{id} URL 模 式 。 因 此 , ASP.NET 将 请 求 地 址 http://localhost:2264/Movies/Edit/1 翻译为 MoviesController 的 Edit 方法,参数 id 为1。查看 App_Start\RouteConfig.cs 文件中的代码: 45 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 你还可以使用查询字符串传递参数,例如 http://localhost:xxxxx/Movies/Edit?ID=1 也可以将参数 id 为1的值传递给 Movies 控制器。 打开 Movies 控制器,它包含了两个 Edit 方法,代码如下: //GET:/Movies/Edit/5 public ActionResult Edit(Int32 id) { Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); 46 } return View(movie); } // //POST:/Movies/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(Movie movie) { if (ModelState.IsValid) { db.Entry(movie).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(movie); } 注意第二个 Edit 方法,它被 HttpPost 特性修饰(代码中黄色背景标注),这个特性 指定只有 POST 请求才能调用这个重载的 Edit 方法。我们可以为第一个 Edit 方法添加 HttpGet 特性,但这不是必须的,因为它是默认值(我们将未标记的方法认定为 HttpGet 方法)。第二个 Edit 方法还有一个 ValidateAntiForgeryToken 特性,这个特性用来阻止 伪造的请求,它和视图(Views\Movies\Edit.cshtml)中的 @Html.AntiForgeryToken() 是成对出现的。 @model MvcMovie.Models.Movie @{ ViewBag.Title = "Edit"; }

Edit

@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true)
Movie @Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.Title, new {@class = "control-label" })
@Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title, null, new {@class = "help-inline" })
47
@Html.AntiForgeryToken() 生成一个表单防伪标记,必须与 MoviesController 中的 Edit 方法匹配。 HttpGet 标记的 Edit 方法接收一个 ID 的参数,通过 Entity Framework Find 方法 查找电影,并将找到的结果返回个 Edit 视图。如果调用 Edit 方法的时候没有参数,ID 参 数的值将会是默认的0。如果未找到电影信息,控制器将返回一个 HttpNotFound。当支架 系统创建 Edit 视图的时候,它会检查 Movie 类,为它的每一个属性创建绘制
还剩87页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

tiangenlan

贡献于2016-11-30

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf