![ASP_MVC_完全解析篇(20210120210802)_第1页](http://file2.renrendoc.com/fileroot_temp3/2021-5/19/392ff29c-1fcc-44e6-bab7-2f4d2be940d9/392ff29c-1fcc-44e6-bab7-2f4d2be940d91.gif)
![ASP_MVC_完全解析篇(20210120210802)_第2页](http://file2.renrendoc.com/fileroot_temp3/2021-5/19/392ff29c-1fcc-44e6-bab7-2f4d2be940d9/392ff29c-1fcc-44e6-bab7-2f4d2be940d92.gif)
![ASP_MVC_完全解析篇(20210120210802)_第3页](http://file2.renrendoc.com/fileroot_temp3/2021-5/19/392ff29c-1fcc-44e6-bab7-2f4d2be940d9/392ff29c-1fcc-44e6-bab7-2f4d2be940d93.gif)
![ASP_MVC_完全解析篇(20210120210802)_第4页](http://file2.renrendoc.com/fileroot_temp3/2021-5/19/392ff29c-1fcc-44e6-bab7-2f4d2be940d9/392ff29c-1fcc-44e6-bab7-2f4d2be940d94.gif)
![ASP_MVC_完全解析篇(20210120210802)_第5页](http://file2.renrendoc.com/fileroot_temp3/2021-5/19/392ff29c-1fcc-44e6-bab7-2f4d2be940d9/392ff29c-1fcc-44e6-bab7-2f4d2be940d95.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持1文档来源为:从网络收集整理.word版本可编辑.個人键入文档标题键入文档副标题键入作者姓名2010-6-17Asp .Net MVC 概述原文链接:/mvc/1.ASP.NET MVC 概览模型-视图-控制器(Model-View-Contoller,MVQ架构模式将应用程序分为了三个主要的组件:模型,视图和控制器。ASP.NETMVC框架为ASP.NETWeb表单模式提供了另一种开发模式一一 基于MVC的Web应用程序。ASP.NETMVC框架是一个轻量的、高度可测试的表现层框架(与基于 表单的Web应用程序相同),它继承在了现有
2、的 ASP.NET功能之中,例如模板页和基于 Membership 的验证。MVC框架定义在了,并且是必不可少的,由部分System.Web命名空间支持。MVC是一个许多开发者都熟悉的、标准的设计模式。一些类型的Web应用程序将从 MVC框架中受益。其他一些应用程序将会继续使用基于Web表单和Postback的传统ASP.NET应用程序模式。还有一些 Web应用程序将会将这两种方法结合;这两种方式互不排斥。MVC框架包含下面的组件:图1 :调用一个需要参数值的控制器动作模型:模型对象是应用程序中实现了数据领域(data domain )逻辑的部分。通常,模型对文档来源为 :从网络收集整理 .w
3、ord 版本可编辑 .欢迎下载支持2文档来源为 :从网络收集整理 .word 版本可编辑 .本系列文章主要从控制器、视图和数据模型这3个Asp.Net MVC基础组建来讲解。象从数据库中获取模型状态, 并且将模型状态保存至数据库。 举个例子, 一个 Product 对象可能 从数据库中获取信息,对它进行操作,然后将更新后的信息写回 SQL Server 中的 Products 表。在小型的应用程序中,模型通常是一个概念上的划分而非一个实际的划分。举个例子,如 果应用程序只是读取 DataSet 然后发送给视图, 应用程序没有一个实际的模型层和相关的类。 在 这种情况下, DataSet 就承担
4、了模型对象的角色。视图:视图是应用程序中显示用户界面(UI)的组件。典型地,这个UI基于模型数据创建。举个例子, Products 表的编辑视图基于 Products 对象的状态显示了文本框、下拉列表,以及复 选框。控制器: 控制器是处理用户交互的组件,它与模型协作,并且最终选择一个要呈现的视图 来显示用户界面。 在MVC应用程序中,视图仅仅显示信息; 控制器处理并且响应用户输入和交互。 举个例子, 控制器处理查询字符串值, 并且将这些值传递给模型, 模型再使用这些参数查询数据 库。MVC莫型帮助创建这样的应用程序,它能够将应用程序的各个方面区分开(输入逻辑、业 务逻辑,以及 UI 逻辑),同
5、时提供这些元素之间的松耦合。这个模式指定了每一种逻辑应该位 于应用程序的哪个位置。 UI 逻辑属于视图。输入逻辑属于控制器。业务逻辑属于模型。这种分 隔有助于你在创建应用程序时管理复杂性,因为它能够让你在一次将精力集中于实现的某一方 面。举个例子,你可以集中在视图,而不依赖于业务逻辑。除了管理复杂性以外,测试应用程序时MVC模式比基于Web表单的ASP.NET应用程序要简单得多。举个例子,在一个基于Web表单的ASP.NET应用程序中,一个类既用于显示输岀,也用于响应用户输入。 为基于 Web表单的ASP.NET应用程序编写自动测试程序是很复杂的,因为要测试每个页面,你必须初始化页面类,它的所
6、有子控件,以及应用程序中其他有所依赖的类。因为为了运行页面初始化了这么多的类,所以编写专用于应用程序单独部分的测试就变得很困难了。测试基于 Web表单的ASP.NET应用程序因此比测试 MVC应用程序更加难以实施。 除此以外,基于 Web表单的ASP.NET应用程序需要一个 Web服务器。MVC框架将组件进行了解耦,并且大量使用 了接口,使得测试独立于框架其他部分的组件成为可能。MVC应用程序三个主要组件之间的松耦合也提升了并行开发的程度。举个例子,一个开发 者可以开发视图, 第二个开发者可以开发控制器逻辑, 而第三个开发者可以将精力集中于模型中 的业务逻辑。1.1决定如何创建MVC应用程序你
7、必须认真考虑是使用 ASP.NET MVC框架实现 Web应用程序,还是使用 ASP.NET Web表单 模型来实现 Web应用程序。MVC框架并没有取代 Web表单模型;你可以选择使用 MVC框架(如果 你已经有基于Web表单的应用程序,它们可以继续像往常一样工作)。对于一个特定的 Web站点,在你决定使用 MVC框架或者 Web窗体模型之前,权衡一下每一 种方式的优势。1.1.1基于MVC勺Web应用程序的优势文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持3文档来源为:从网络收集整理.word版本可编辑.ASP.NET MVC框架提供了下面的优点:?通过将应用程序分为了模型、
8、视图和控制器,它在管理复杂性方面更加的简单。?它不适用视图状态或者基于服务器的表单。对于那些想要完全控制应用程序行为的开发者来说,MVC框架是很理想的。?通过一个控制器,它使用了Front Controller模式来处理对Web应用程序的请求。这允许你设计岀一种可以支持丰富的路由结构的应用程序。关于Front Co ntroller的更多信息,可以查看 MSDN网站。?它为测试驱动开发(test-driven development, TDD)提供了更好的支持。?对于那些由大型开发者和设计者所支持的Web应用程序来说,它运作得很好,能够对应用程序的行为提供更高层次的控制。1.1.2 基于Web
9、窗体的Web应用程序的优势基于Web窗体的框架提供了下面的优势:?它支持在HTTP上保存状态的事件模型,这有益于lin e-of-bus in ess的Web应用程序开发。基于Web窗体的应用程序提供了大量的事件,它们被数以百计的服务器控件 所支持。?它使用了一个 Page Controller模式来为单个页面添加功能。关于Page Controller的更多信息,可以参考 MSDN网站。?它使用了视图状态或者基于服务器的表单,这使得管理状态信息更加容易。?对于那些想要利用大量的用于快速应用程序开发组件的小型Web开发者和设计者团队来说,它工作得很好。?总的来说,对于应用程序开发来说,它更加的
10、简单,因为组件(Page类,控件等)已经紧密地集成了,并且通常比MVC需要编写更少的代码。1.2 ASP.NET MVC框架的功能ASP.NET MVC框架提供了下面的功能:?应用程序任务的分离(输入逻辑、业务逻辑和用户界面逻辑),可测试性,以及默认 的测试驱动开发。MVC框架中的所有核心契约都是基于接口的,并且可以使用mock对象进行测试,mock对象是模拟的对象,它们可以模仿应用程序中实际对象的行为。 你可以对应用程序进行单元测试,而不需要在ASP.NET进程中运行控制器,这使得单元测试更快速也更灵活。?它是一个可扩展和可插入的框架。ASP.NET MVC框架的组件设计为可以很容易地替换或
11、者定制。你可以嵌入你自己的视图引擎、URL路由策略、动作方法参数序列化,以及其他组件。ASP.NET MVC框架也支持使用依赖注入(Depe ndency Injection , DI)和控件倒置(In version of Co ntrol,IOC)容器模型。DI允许你将对象注入文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持4文档来源为:从网络收集整理.word版本可编辑.到类中,而不是基于类来创建对象本身。IOC制定了如果一个对象需要另一个对象,第一个对象应该由外部源,例如配置文件,获得第二个对象。这使得测试更加容易。? 一个强大的URL映射组件,允许你创建拥有着易于理解和便
12、于搜索的URL的应用程序。URL并不需要包含文件名扩展,并且设计为有利于搜索引擎优化(SEO和表现状态传输(representational state transfer)的 URL命名模式。?支持在现有的 ASP.NET页面(.aspx文件)、用户控件(.ascx文件)和模板页(.master 文件)文件中使用标记来作为视图模板。你可以与ASP.NET MVC框架一起使用现有的ASP.NET功能,例如嵌套模板页,in-line 表达式(%,声明式服务器控件、 模板、数据绑定、本地化等等。?支持现有的 ASP.NET功能。ASP.NET MVC允许你使用例如表单验证和Windows验证、URL
13、授权、成员资格和角色、输出和数据缓存、会话和档案状态管理、健康监视器、 配置系统和Provider架构这些ASP.NET的功能。2. 理解MVC应用程序执行过程对基于ASP.NET MVC勺Web应用程序发岀的请求首先通过UrlRoutingModule 对象,它是一个Http模块。这个模块对请求进行解析,并且执行路由选择。UrlRoutingModule 对象选择与当前请求所匹配的第一个路由对象(路由对象十一哥实现了RouteBase的类,典型地是是一个 Route类的实例)。如果没有路由匹配,UrlRout in gModule 对象什么也不做,并且让请求回退到通常的Asp.Net或者II
14、S请求处理。从所选择的 Route对象中,UrlRoutingModule 对象获取与 Route对象相关的IRouteHandler 对象。典型地,在一个MVC应用程序中,这是一个MvcRouteHandler的实例。IRouteHandler 实例创建了一个IHttpHa ndler 对象,并且向它传递 IHttpC on text对象。默认情况下,MVC的IHttpHandler 实例是一个 MvcHandler对象。MvcHandler对象然后选择控制器,该控制器最终处理请求。NOTE当ASP.NET MVC应用程序运行在IIS7.0中时,MVC项目对文件的扩展名没有要求。 然而,在I
15、IS6.0 中,handler要求你将.mvc文件名后缀映射到 ASP.NET ISAPI DLL。模块和处理器(handler )是ASP.NET MVC框架的入口点。它们执行下面的动作:?在MVC Wet应用程序中选择合适的控制器。?获取一个特定的控制器实例。?调用控制器的Execute方法。下面的表列岀了 MVC Web项目的执行阶段。阶段细节收到应 用程序在Global.asax 文件中,Route对象添加到RouteTable对象中。文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持5文档来源为:从网络收集整理.word版本可编辑.的第一 个请求执行路由UrlRouting
16、Module模块使用RouteTable集合中的第一个匹配的Route对象来创建RouteData对象,该对象然后被用来创建 RequestContext (IHttpContext )对象。创建MVC青 求处理 器MvcRouteHandler对象创建一个 MvcHandler类的实例,并且将 RequestContext实例传递给它。创建控制器MvcHa ndler对象使用RequestC on text实例来识别出 ICon trollerFactory对象(典型地,是一个DefaultC on trollerFactory类的实例),来创建控制器实例。调用动作大多数控制器都继承自Con
17、 troller基类。对于这些控制器来说,与 控制器相关的ControllerActionlnvoker对象决定调用控制器类的哪一个动作方法,然后调用它。执行结 果一个典型的动作方法可能会接收用户输入,准备合适的响应数据,然 后通过返回一个结果类型来执行结果。内置的、可以执行的结果包括 下面这些:ViewResult (呈现一个视图,是最常使用的结果类型), RedirectToRouteResult、RedirectResult、ContentResult、 JsonResult 和 EmptyResult。3. 理解模型、视图和控制器这篇教程将为你提供 ASP.NET MVC模型、视图、控
18、制器的高层次概览。换言之,它解释了 ASP.NET MVC中的“ M”、 “ V” 和“ C”。在读完本教程之后,你应该能够理解ASP.NET MVC应用程序中的各个不同部分是如何一起工作的。你也应该能够理解ASP.NETMVC应用程序与ASP.NETWeb窗体应用程序和动态服务器页面应用程序在构架上有何不同。3.1范例ASP.NET MVC应用程序Visual Studio 用于创建 ASP.NET MVC Web应用程序的默认模板包括了一个极其简单的范 例应用程序,可以使用它来理解 ASP.NETMVC应用程序的各个部分。我们将会在这篇教程中利用 这个简单的应用程序。你可以通过启动 Vis
19、ual Studio2008,并且在菜单中选择File (文件)”、“ NewProject (新建项目)”来使用 MVC模板创建一个新的 ASP.NETMVC应用程序(如图1)。在“新建项目 文档来源为 :从网络收集整理 .word 版本可编辑 .欢迎下载支持6文档来源为 :从网络收集整理 .word 版本可编辑 .对话框,在项目类型下选择你喜欢的编程语言( Visual Basic 或者C#),并且在模板下选择 ASP.NET MVC Web应用程序。点击“确定”按钮。图 1 - 新建项目对话框当你创建一个新的 ASP.NETMVC应用程序时,将会岀现“创建单元测试项目( Create U
20、nit Test Project )”对话框(如图 2)。这个对话框允许你在解决方案下创建一个独立的项目用于 测试你的 ASP.NET MVC应用程序。选择选项 No, do not create a unit test project(否,不要创建单元测试项目)”,并且点击“0K (确定)”按钮。图 2 - 创建单元测试对话框在新的ASP.NET MVC应用程序创建好之后。你将会在解决方案浏览器窗口中看到几个文件 夹和文件。特别地,你将会看到三个文件夹,名字是 Models 、Views 和 Controllers 。正如你从 文件夹的名称可以推测岀的,这三个文件夹包含了实现了模型、视图和控
21、制器的文件。如果你展开 Controller 文件夹, 你应该会看到一个命名为 HomeController.cs 的文件。 如 果你展开Views文件夹,你应该看到两个子文件夹,名称是Home和Shared。如果你展开 Home文件夹,你将会再次看到两个文件,名称是About.aspx和Home.aspx (见图3)。这些文件组成了这个包含在默认 ASP.NET MVC模板中的范例应用程序。图 3 - 解决方案浏览器窗口你可以通过选择菜单项 Debug (调试)、“ Start Debugging(启动调试)来运行这个范例应用程序。除此以外,你可以点击 F5 键。当你第一次运行 ASP.NE
22、T应用程序,将会岀现图4中的对话框,建议你开启调试模式。点击“确定”按钮将会运行应用程序。图 4 - 未开启调试对话框当你运行一个 ASP.NET MVC应用程序,Visual Studio会在你的web浏览器中运行应用程序。这个范例应用程序只含有两个页面: Index 页面和 About 页面。当应用程序第一次启动时, 将会显示 Index 页面(见图 5)。你可以通过点击应用程序右上角的菜单链接导航到About 页面。图 5 - Index 页面注意一下你浏览器地址栏中的 URJ当你点击Home菜单链接,浏览器地址栏的URL将变为/Home。当你点击 About菜单链接,浏览器地址栏的UR
23、L变为/About。3.2 一个URL并不等同于一个页面当你创建一个传统的 ASP.NETWeb窗体应用程序,或者是一个动态服务器页面(ASP)应用程序,在URL与页面之间存在一对一的对应。如果你请求服务器上的一个名为SomePage.aspx的页面, 那么最好在磁盘上有一个 SomePage.aspx 页面。 如果 SomePage.aspx 文件并不存在, 你 将会获得一个丑陋的 404- 页面不存在错误 。文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持7文档来源为:从网络收集整理.word版本可编辑.当创建一个ASP.NET MVC应用程序时则大不相同,你键入到浏览器地址栏
24、的URL与你应用程序中的文件之间并没有一个对应关系。在一个ASP.NETMVC应用程序中,一个 URL与一个控制器的动作相对应,而不是磁盘上的页面。对于一个传统的 ASP.NET或者ASP应用程序,浏览器请求被映射到了页面。在ASP.NETMVC应用程序中,浏览器请求被映射到了控制器动作。一个ASP.NETWeb窗体应用程序是以内容为中心的。而一个 ASP.NET MVC应用程序则以是应用程序逻辑为中心的。3.3理解URL路由一个浏览器请求通过名叫URL路由(URLRouting )的ASP.NETMVC功能被映射到了一个控制器动作。URL路由将即将到来的请求发送到了控制器动作。URL路由使用
25、一张路由表来处理来到的请求。这个路由表在你的Web应用程序首次启动时创建。这个路由表建立在Global.asax 文件中。代码清单 1包含了这个默认的 MVCGIobal.asax文件。代码清单 1 - Glabal.asaxpublic classGlobalApplicati onpublic static void RegisterRoutes(RouteCollectio n routes)routes.Ig noreRoute(resource.axd/*pathl nfo);routes.MapRoute(Default ,co ntroller/actio n/id,new co
26、n troller =Home, acti on = I ndex, id = );protected void Applicatio n Start()RegisterRoutes(RouteTable.Routes);文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持8文档来源为:从网络收集整理.word版本可编辑.当ASP.NET应用程序第一次启动时,将调用Application_Start()方法。在代码清单 1中,这个方法调用了 RegisterRoutes() 方法,并且RegisterRoutes()方法创建了默认的路由表。默认的路由表只含有一个路由。这个默认的路由将所
27、有到来的请求分为了三个分段(一个 URL分段是正斜杠之间的任何东西)。第一个分段映射到了控制器名称,第二个分段映射到了动 作名称,最后一个分段映射到了传递给动作的名为Id的参数。例如,考虑下面的URL:/Product/Details/3这个URL将会被解析为像这样的三个部分:Con troller = ProductC on trollerActi on = DetailsId = 3注意到Controller后缀被添加到了控制器参数的末尾。这只是MVC勺一个怪癖而已。默认的路由包含所有三个分段的默认值。默认的控制器是HomeC on troller ,默认的动作是Index,默认的Id是一
28、个空字符串。 脑子里记下这三个默认值,考虑下面的URL是如何被解析的:/Employee这个URL将被解析为像这样的三个参数:Con troller = EmployeeC on trollerActi on = In dexId =最后,如果你打开一个ASP.NETMVC应用程序而不提供任何的URL(例如,然后这个URL将会被解析成这样:Con troller = HomeC on trollerActi on = In dexId =这个请求被发送到了HomeController 类的Index()动作文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持9文档来源为:从网络收集整理
29、.word版本可编辑.3.4理解控制器控制器负责用户与 MVC应用程序交互的方式。当用户发岀浏览器请求时,控制器决定向用 户发回什么样的响应。控制器不过是一个类(例如,一个Visual Basic 或者C#类)。这个范例 ASP.NET MVC应用程序包含一个名为HomeCo ntroller.cs的控制器,它位于 Con trollers 文件夹下。HomeController.cs的内容再次显示在了代码清单2中。代码清单 2 - HomeConroller.csusing System;usi ng ;using System.L inq;using System.Web;usi ng ;
30、namespace MvcApplication1.Controllerspublic classHomeC on troller: Con trollerpublic Acti on Result In dex()ViewDataTitle =Home Page;ViewDataMessage =Welcome to ASP.NET MVC! ;return View();public Actio nResult About()ViewDataTitle =About Page ;return View();注意到HomeController 拥有两个方法,名为Index()和About()
31、。这两个方法对应于控制器暴露岀的两个动作。URL /Home/Index 将会调用 HomeController.lndex()方法,而 URL/Home/About 会调用 HomeController.About()方法。控制器中的任何公共方法都被暴露为一个控制器动作。对此你需要多加小心。这就意味着 包含在控制器中的任何公共方法都可以由任何可以访问互联网的人调用,通过在浏览器中输入正确的URL文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持10文档来源为:从网络收集整理.word版本可编辑.3.5理解视图由HomeController 类暴露岀的两个控制器动作,Index()和
32、About(),都返回了一个视图视图含有将会发送给浏览器 HTML标记和内容。当使用 ASP.NET MVC应用程序时,一个视图等同 于一个页面。你必须在正确的位置创建你的视图。HomeCo ntroller. In dex()动作返回了一个位于以下路径的视图:ViewsHomel ndex.aspxHomeCo ntroller.About()动作返回一个位于以下路径的视图:ViewsHomeAbout.aspx一般而言,如果你想为一个控制器动作返回一个视图,那么你需要在Views文件夹下创建一个子文件夹,这个文件夹与你的控制器同名。在子文件夹下,你必须创建一个.aspx文件,它的名字与控制
33、器动作相同。代码清单3中的文件含有 About.aspx视图。代码清单 3 - About.aspxv% Page Lan guage=C# MasterPageFile=/Views/Shared/Site.MasterAutoEventWireup=true CodeBehind= Inherits=%About UsTODO: Put about content here.如果你忽略代码清单中的第一行,视图剩余的大部分是由标准的HTML构成的。你可以在这里输入任何你想要的HTML来修改视图的内容。视图非常类似于动态服务器页面(ASP)中的页面,或者 ASP.NET的Web窗体。视图可以含
34、有HTML内容和脚本。你可以使用你所喜爱的.NET语言(例如,C#或者Visual Basic .Net )编写脚本。你使用脚本显示动态的内容,例如数据库数据。3.6理解模型我们已经讨论了控制器,我们也讨论了视图。我们需要讨论的最后一个话题是模型。MVC模型是什么呢?文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持11文档来源为:从网络收集整理.word版本可编辑.MVCI勺模型包含了你应用程序中的所有逻辑,这些逻辑没有包含在视图或者控制器中。模 型应该包含你的应用程序中的所有业务逻辑和数据库访问逻辑。例如,如果你使用LINQ to SQL访问数据库,那么你可以在Models文件夹
35、中创建你的 LINQ to SQL类(你的dbml文件)。视图应该仅包含与生成用户界面有关的逻辑。控制器应该仅仅只包含最少量的逻辑,用于 返回正确的视图或者将用户重定向到另一个动作。任何其他的事情都应该包含在模型中。通常,你应该竭尽全力创建一个丰富的模型以及一个瘦小的控制器。你的控制器方法应该 只包含几行代码。如果一个控制器动作变得太丰富,那么你应该考虑将这些逻辑抽取出来放置到Models文件夹的新类中。3.7总结这篇教程为你提供了 ASP.NET MVC Web应用程序各个不同部分的一个高层次的概览。你学 习了 URL路由如何将即将到来的浏览器请求发往特定的控制器动作。你还学习了控制器是如何
36、协调视图怎样返回浏览器的。最后,你学习了模型是怎样包含应用程序的业务和数据库访问逻辑的。Asp .Net MVC 控制器原文链接:/mvc/这篇教程探索了 ASP.NET MVC控制器(controller)、控制器动作(controller action )和动作结果(action results )这几个主题。在读完本篇教程之后,你将会理解控制器如何控制 访问者与ASP.NET MVC网站进行交互的方式。1. 理解控制器MVC空制器负责响应对 ASP.NET MVC网站发起的请求。每一个浏览器请求都映射到了一个 专门的控制器。举个例子,设想一下你在浏览器地址栏输入了下面的URL:在这种情况
37、下,将会调用一个名为ProductCo ntroller的控制器。ProductCo ntroller负责生成对浏览器请求的响应。举个例子,控制器可能会返回一个特定的视图,或者是将用户重定向到另一个控制器。你可以通过在ASP.NET MVC应用程序的Co ntrollers文件夹下添加一个新的控制器来创建一个新控制器。右键点击控制器的文件夹,并且选择菜单项“ Add (添加)”,“ New(新建项)并选择“ MVCControllerClass (MVC控制器类)”(见图1)。控制器的名字必须含有Controller后缀。举个例子,控制器名称ProductController 没什么问题,但是
38、控制器Product就不起作用图1 -创建一个新的控制器如果你创建一个新的名为ProductCo ntroller的控制器,那么你将会获得代码清单1所示文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持12文档来源为:从网络收集整理.word版本可编辑.的文件。代码清单 1 - ProductController.csusing System;usi ng ;using System.L inq;using System.Web;usi ng ;namespace MvcApp.Controllerspublic class ProductCo ntroller: Con troll
39、erpublicActi on Result In dex()/ Add acti on logic herethrow new NotImpleme ntedExceptio n();如同你在代码清单 1中所看到的,控制器不过是一个类(Visual Basic.Net 或者是C#类)My Tasks. display ing all tasksAdd new Task现在Index.aspx 视图并没有显示任何的任务-它只是声明它将会显示。在这个教程后面,我们将会为In dex.aspx页面添加一些脚本来显示任务列表。注意到Index.aspx 视图含有标为“Add new task ”的链
40、接。这个链接指向到了 /Home/Create 路径。当你点击这个链接,HomeController的Create()动作将会被调用。Create()方法返回Create 视图。Create.aspx视图含有一个用于创建新任务的表单。这个视图的内容包含在清单3中:清单 3 - Create.aspxAdd New Task文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持38文档来源为:从网络收集整理.word版本可编辑.Task:v/label文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持39文档来源为:从网络收集整理.word版本可编辑.这个 URL对应于 Home
41、Controller v/formv/div注意到清单3中包含的表单提交到了下面的URL:/Home/CreateNew.aspx控制器中的CreateNew()动作。代表着新任务的表单数据 将会提交到这个动作。1.5创建数据库下一步是创建含有任务的数据库。你可以通过在App_Data文件夹上点击右键,并且选择菜单项,“添加(Add)”、“新建项(New Item )”来创建数据库。选择“ SQL Server数据库” 模板项,将数据库命名为 TaskListDB.mdf ,并且点击“添加(Add)”按钮。接下来,我们需要向数据库中添加一张含有任务的表。在解决方案浏览器窗口中双击TaskLis
42、tDB.mdf以打开服务器浏览器窗口。右键点击“表”文件夹,并且选择“添加新表(AddNew Table )”菜单项。选择这个菜单项将会打开数据库表设计器。创建下面的数据库列:列名数据类型是否允许NULLIdIntFalseTaskNVarchar(300)FalseIsCompletedBitFalseEn tryDateDateTimeFalse第一列,Id列,有两个特殊的属性。首先,你需要将Id标记为主键列。在选择Id列之后,点击设置主键(Set Primary Key )按钮(这是一个看上去像钥匙的图标)。第二步,你需 要将Id列标记为标识列(IdentityColumn)。在列属性窗
43、口,向下滚动到标识详细信息(IdentitySpecification)” 一节并展开它。将是否为标识( Is Identity )”值改为 Yes。当你做完这些以后,表格将会如图4所示。图4. Tasks 表格最后一步是保存这个新的表格。点击“保存( Save) ”按钮(软盘的图标)并且将新表格 命名为Tasks。文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持40文档来源为:从网络收集整理.word版本可编辑.1.6创建模型一个MVC模型包含了你的应用程序和数据库访问的大部分逻辑。通常,你可以将包含在 MVC应用程序中的大部分类都放在Models文件夹中。你的应用程序中所有没有
44、包含在视图或者控制器的逻辑都被推向了Models文件夹。在这篇教程中,我们将会使用LINQ to SQL来与我们上一小节创建的数据库通信。就我自己而言,我喜欢LINQ to SQL然而,并不要求你一定在 ASP.NETMVC应用程序中使用 LINQ to SQL 如果你愿意,你可以使用其他的技术,例如NHibernate或者Entity Framework来与数据库进行通信。为了使用LINQ to SQL,我们必须首先在 Models文件夹中创建我们的LINQ to SQL类。右键点击Models文件夹,选择“添加”、“新建项”菜单项,并且选择“LINQ to SQL Classes ”模板项
45、。将你新建的LINQ to SQL类命名为TaskList.dbml并且点击“添加(Add)”按钮。在你完成这一步骤之后,将会显示对象关系设计器(Object Relatio nal Desig ner )。我们需要创建一个 LINQ to SQL实体类,它代表了我们的Tasks数据库表。将 Tasks数据库表从解决方案浏览器窗口拖曳到对象关系设计器中。执行完最后这一个动作,将会创建一个新的名为Task的LINQ to SQL实体类(参看图 5)。点击“保存(Save)”按钮(软盘的图标) 以保存这个新的实体。图5 - Task 实体1.7向控制器方法中添加数据库逻辑现在我们已经拥有了数据库,
46、我们可以修改我们的控制器动作,以便从数据库中存储和获 取任务。修改后的HomeController 包含在清单4中。清单 4 - HomeController.csusing System;usi ng ;using System.L inq;using System.Web;usi ng ;using TaskList.Models;namespace TaskList.Controllers public classHomeC on troller: Con troller privateTaskListDataC on textdb = new TaskListDataC on text
47、();/显示任务列表publicActio nResult In dex() var tasks = from tin db.Tasksorderby t.E ntryDatedesce nding select t;文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持41文档来源为:从网络收集整理.word版本可编辑.return View(tasks.ToList();/显示创建新任务的表单 public Actio nResult Create() return View();/向数据库中添加一个新任务public Action Result CreateNew(stringde
48、scription) Task newTask = new Task ();n ewTask.Descripti on = descripti on;n ewTask.lsCompleted =false ;n ewTask.E ntryDate = DateTime.Now;db.SubmitCha nges();return RedirectToActio n(I ndex );/将任务标记为任务publicAction Result Complete(int Id) /数据库逻辑var tasks = from tin db.Tasks where t.Id = Id select t;
49、foreach (Task match in tasks)match.IsCompleted =true ;db.SubmitCha nges();retur nRedirectToActi on(I ndex );注意到清单 4中的HomeController 含有一个类级(class-level )的私有字段,名为db。这个db字段是一个TaskListDataContext类的实例。HomeController类使用db字段来代表TaskListDB 数据库。Index()控制器的动作已经被修改为获得所有来自Tasks数据库表的记录。tasks被传递到了 Index视图中。CreateN
50、ew()方法被修改为在 Tasks数据库表中创建一个新的任务。注意到CreateNew()方法已经被修改为接受一个名为description的字符串参数。这个参数代表着由Create视图传递文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持42文档来源为:从网络收集整理.word版本可编辑.进来的description文本表单字段。ASP.NETMVC匡架自动将表单字段作为参数传递给控制器动作。最后,Complete。务标记为已完成,任务的方法被修改为更改 Tasks数据库表的IsComplete列的值。当你将一个任 Id被传递给Complete。动作,并更新数据库。1.7 修改 I
51、ndex视图为了完成我们的 TaskList应用程序,我们还必须再做最后一件事。我们必须修改Index视图,以便它能够显示所有任务的列表,并且允许我们将某一任务标记为已完成。修改过的Index视图包含在了清单 5中。清单 5 - Index.aspxv% Page Lan guage=C# AutoEve ntWireup=true CodeBehi nd=In herits= % In dexMy Tasks-ahref=/Home/Complete/Complete- 文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持43文档来源为:从网络收集整理.word版本可编辑.Add n
52、ew Task v/div在清单5中的Index视图含有一个 C# foreach循环,它遍历了所有的任务。这些任务由 ViewData.Model属性所表示。概括来讲,你使用 ViewData来将数据从控制器传递到视图。在循环体内部,有一个条件判断用来检查任务是否已完成。一个已完成的任务使用一个穿 过它的横线(删除线)来表示。HTML的标签用来创建横穿已完成任务的横线。如果这个任务还没有完成,将在任务旁边显示一个标记为Complete的链接。这个链接由下面的脚本创建:a href=/Home/Complete/Complete注意到任务的Id被包含在由链接所表示的 URL中。当你点击链接时,
53、这个任务 Id将会传 递到HomeController 类的Complete。动作中。通过这种方式,当你点击Complete链接时,将会更新正确的数据库记录。Index视图的最终版本所显示的页面位于图6中。图6 - Index视图1.8总结这篇教程的目的是让你体验一下创建一个ASP.NET MVC应用程序的经过。我希望你会发现创建一个ASP.NET MVC Wet应用程序与创建一个动态服务器页面(ASP)或者ASP.NET应用程序的经历非常类似。在这篇教程中,我们只考察了 ASP.NET MVC框架中最基本的一些功能。在后续的教程中, 我们将会更加深入到一些主题,例如控制器、控制器动作、视图、
54、视图数据和HTML helper中Asp.Net MVC(理解模型、视图和控制器)-Part.2原文链接:/mvc/tutorial-02-cs.aspx这篇教程将为你提供 ASP.NET MVC模型、视图、控制器的高层次概览。换言之,它解释了 ASP.NET MVC中的“ M”、“ V” 和“ C”。在读完本教程之后,你应该能够理解ASP.NET MVC应用程序中的各个不同部分是如何一起工作的。你也应该能够理解ASP.NETMVC应用程序与ASP.NETWeb窗体应用程序和动态服务器页面应用程序在构架上有何不同。文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持44文档来源为:从网
55、络收集整理.word版本可编辑.1. 范例 ASP.NET MVC 应用程序Visual Studio 用于创建 ASP.NET MVC Web应用程序的默认模板包括了一个极其简单的范 例应用程序,可以使用它来理解 ASP.NETMVC应用程序的各个部分。我们将会在这篇教程中利用 这个简单的应用程序。你可以通过启动 Visual Studio2008 ,并且在菜单中选择“ File (文件)”、 “ NewProject (新建项目)”来使用 MVC莫板创建一个新的 ASP.NETMVC应用程序(如图1)。在“新建项目对话框,在项目类型下选择你喜欢的编程语言(Visual Basic 或者C#
56、),并且在模板下选择ASP.NET MVC Web应用程序。点击“确定”按钮。图 1 - 新建项目对话框当你创建一个新的 ASP.NETMVC应用程序时,将会岀现“创建单元测试项目( Create Unit Test Project )”对话框(如图 2)。这个对话框允许你在解决方案下创建一个独立的项目用于 测试你的 ASP.NET MVC应用程序。选择选项 No, do not create a unit test project(否,不要创建单元测试项目)”,并且点击“0K (确定)”按钮。图 2 - 创建单元测试对话框在新的ASP.NET MVC应用程序创建好之后。你将会在解决方案浏览器
57、窗口中看到几个文件 夹和文件。特别地,你将会看到三个文件夹,名字是Models 、Views 和 Controllers 。正如你从文件夹的名称可以推测岀的,这三个文件夹包含了实现了模型、视图和控制器的文件。如果你展开 Controller 文件夹, 你应该会看到一个命名为 HomeController.cs 的文件。 如 果你展开Views文件夹,你应该看到两个子文件夹,名称是Home和Shared。如果你展开 Home文件夹,你将会再次看到两个文件,名称是About.aspx和Home.aspx (见图3)。这些文件组成了这个包含在默认 ASP.NET MVC模板中的范例应用程序。图 3
58、- 解决方案浏览器窗口你可以通过选择菜单项Debug (调试)、“ Start Debugging(启动调试)来运行这个范例应用程序。除此以外,你可以点击 F5 键。当你第一次运行 ASP.NET应用程序,将会岀现图4中的对话框,建议你开启调试模式。点击“确定”按钮将会运行应用程序。图 4 - 未开启调试对话框当你运行一个 ASP.NET MVC应用程序,Visual Studio会在你的web浏览器中运行应用程序。这个范例应用程序只含有两个页面: Index 页面和 About 页面。当应用程序第一次启动时, 将会显示 Index 页面(见图 5)。你可以通过点击应用程序右上角的菜单链接导航
59、到About 页面。图 5 - Index 页面注意一下你浏览器地址栏中的URJ当你点击Home菜单链接,浏览器地址栏的URL将变为/Home。当你点击 About菜单链接,浏览器地址栏的URL变为/About。文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持45文档来源为:从网络收集整理.word版本可编辑.2. 一个URL并不等同于一个页面当你创建一个传统的 ASP.NETWeb窗体应用程序,或者是一个动态服务器页面(ASP应用程序,在URL与页面之间存在一对一的对应。如果你请求服务器上的一个名为SomePage.aspx的页面,那么最好在磁盘上有一个SomePage.aspx
60、页面。如果SomePage.aspx文件并不存在, 你将会获得一个丑陋的 404-页面不存在错误。当创建一个ASP.NET MVC应用程序时则大不相同,你键入到浏览器地址栏的URL与你应用程序中的文件之间并没有一个对应关系。在一个ASP.NETMVC应用程序中,一个 URL与一个控制器的动作相对应,而不是磁盘上的页面。对于一个传统的 ASP.NET或者ASP应用程序,浏览器请求被映射到了页面。在ASP.NETMVC应用程序中,浏览器请求被映射到了控制器动作。一个ASP.NETWeb窗体应用程序是以内容为中心的。而一个 ASP.NET MVC应用程序则以是应用程序逻辑为中心的。3. 理解URL路
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家具购销的简单合同范本
- 全新财务人员劳动合同
- 大楼物业管理委托合同
- 后八轮自卸车租赁合同范本
- 沪教版(上海)七年级地理第一学期祖国篇(上)4.3《长江》听课评课记录
- 股东合作协议合同模板
- 加盟合同协议书范本
- 搅拌站矿粉购销简易合同
- 《研究性学习》课程实施方案
- 合同书样本范文电子版
- 药用植物种植制度和土壤耕作技术
- 《火力发电企业设备点检定修管理导则》
- 重庆市渝北区2024年八年级下册数学期末统考模拟试题含解析
- 保安服务项目信息反馈沟通机制
- 《团队介绍模板》课件
- 常用中医适宜技术目录
- 冲压模具价格估算方法
- 运动技能学习与控制课件第十一章运动技能的练习
- 虫洞书简全套8本
- 2023年《反电信网络诈骗法》专题普法宣传
- 小学数学五年级上、下册口算题大全
评论
0/150
提交评论