版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、個人Asp.Net 全面解析來自的文章HuangHao2010-5-17本系列文章主要从控制器、视图和数据模型这3个Asp.Net MVC基础组建来讲解。Asp.Net MVC 概述原文链接:HYPERLINK :/ ASP.NET MVC 概览模型-视图-控制器(Model-View-Contoller, MVC)架构模式将应用程序分为了三个主要的组件:模型,视图和控制器。ASP.NET MVC框架为ASP.NET Web表单模式提供了另一种开发模式基于MVC的Web应用程序。ASP.NET MVC框架是一个轻量的、高度可测试的表现层框架(与基于表单的Web应用程序相同),它继承在了现有的功
2、能之中,例如模板页和基于Membership的验证。MVC框架定义在了命名空间中,并且是必不可少的,由部分命名空间支持。MVC是一个许多开发者都熟悉的、标准的设计模式。一些类型的Web应用程序将从MVC框架中受益。其他一些应用程序将会继续使用基于Web表单和Postback的传统应用程序模式。还有一些Web应用程序将会将这两种方法结合;这两种方式互不排斥。MVC框架包含下面的组件:图1:调用一个需要参数值的控制器动作模型:模型对象是应用程序中实现了数据领域(data domain)逻辑的部分。通常,模型对象从数据库中获取模型状态,并且将模型状态保存至数据库。举个例子,一个Product对象可能
3、从数据库中获取信息,对它进行操作,然后将更新后的信息写回SQL Server中的Products表。在小型的应用程序中,模型通常是一个概念上的划分而非一个实际的划分。举个例子,如果应用程序只是读取DataSet然后发送给视图,应用程序没有一个实际的模型层和相关的类。在这种情况下,DataSet就承担了模型对象的角色。视图:视图是应用程序中显示用户界面(UI)的组件。典型地,这个UI基于模型数据创建。举个例子,Products表的编辑视图基于Products对象的状态显示了文本框、下拉列表,以及复选框。控制器:控制器是处理用户交互的组件,它与模型协作,并且最终选择一个要呈现的视图来显示用户界面。
4、在MVC应用程序中,视图仅仅显示信息;控制器处理并且响应用户输入和交互。举个例子,控制器处理查询字符串值,并且将这些值传递给模型,模型再使用这些参数查询数据库。MVC模型帮助创建这样的应用程序,它能够将应用程序的各个方面区分开(输入逻辑、业务逻辑,以及UI逻辑),同时提供这些元素之间的松耦合。这个模式指定了每一种逻辑应该位于应用程序的哪个位置。UI逻辑属于视图。输入逻辑属于控制器。业务逻辑属于模型。这种分隔有助于你在创建应用程序时管理复杂性,因为它能够让你在一次将精力集中于实现的某一方面。举个例子,你可以集中在视图,而不依赖于业务逻辑。除了管理复杂性以外,测试应用程序时MVC模式比基于Web表
5、单的应用程序要简单得多。举个例子,在一个基于Web表单的应用程序中,一个类既用于显示输出,也用于响应用户输入。为基于Web表单的应用程序编写自动测试程序是很复杂的,因为要测试每个页面,你必须初始化页面类,它的所有子控件,以及应用程序中其他有所依赖的类。因为为了运行页面初始化了这么多的类,所以编写专用于应用程序单独部分的测试就变得很困难了。测试基于Web表单的应用程序因此比测试MVC应用程序更加难以实施。除此以外,基于Web表单的应用程序需要一个Web服务器。MVC框架将组件进行了解耦,并且大量使用了接口,使得测试独立于框架其他部分的组件成为可能。MVC应用程序三个主要组件之间的松耦合也提升了并
6、行开发的程度。举个例子,一个开发者可以开发视图,第二个开发者可以开发控制器逻辑,而第三个开发者可以将精力集中于模型中的业务逻辑。1.1 决定如何创建MVC应用程序你必须认真考虑是使用ASP.NET MVC框架实现Web应用程序,还是使用ASP.NET Web表单模型来实现Web应用程序。MVC框架并没有取代Web表单模型;你可以选择使用MVC框架(如果你已经有基于Web表单的应用程序,它们可以继续像往常一样工作)。对于一个特定的Web站点,在你决定使用MVC框架或者Web窗体模型之前,权衡一下每一种方式的优势。1.1.1 基于MVC的Web应用程序的优势ASP.NET MVC框架提供了下面的优
7、点:通过将应用程序分为了模型、视图和控制器,它在管理复杂性方面更加的简单。它不适用视图状态或者基于服务器的表单。对于那些想要完全控制应用程序行为的开发者来说,MVC框架是很理想的。通过一个控制器,它使用了Front Controller模式来处理对Web应用程序的请求。这允许你设计出一种可以支持丰富的路由结构的应用程序。关于HYPERLINK :/go.microsoft /fwlink/?LinkId=106357 t _blankFront Controller的更多信息,可以查看MSDN网站。它为测试驱动开发(test-driven development, TDD)提供了更好的支持。对
8、于那些由大型开发者和设计者所支持的Web应用程序来说,它运作得很好,能够对应用程序的行为提供更高层次的控制。1.1.2 基于Web窗体的Web应用程序的优势基于Web窗体的框架提供了下面的优势:它支持在 上保存状态的事件模型,这有益于line-of-business的Web应用程序开发。基于Web窗体的应用程序提供了大量的事件,它们被数以百计的服务器控件所支持。它使用了一个Page Controller模式来为单个页面添加功能。关于HYPERLINK :/go.microsoft /fwlink/?LinkId=106359 t _blankPage Controller的更多信息,可以参考M
9、SDN网站。它使用了视图状态或者基于服务器的表单,这使得管理状态信息更加容易。对于那些想要利用大量的用于快速应用程序开发组件的小型Web开发者和设计者团队来说,它工作得很好。总的来说,对于应用程序开发来说,它更加的简单,因为组件(Page类,控件等)已经紧密地集成了,并且通常比MVC需要编写更少的代码。 MVC框架的功能ASP.NET MVC框架提供了下面的功能:应用程序任务的分离(输入逻辑、业务逻辑和用户界面逻辑),可测试性,以及默认的测试驱动开发。MVC框架中的所有核心契约都是基于接口的,并且可以使用mock对象进行测试,mock对象是模拟的对象,它们可以模仿应用程序中实际对象的行为。你可
10、以对应用程序进行单元测试,而不需要在进程中运行控制器,这使得单元测试更快速也更灵活。它是一个可扩展和可插入的框架。ASP.NET MVC框架的组件设计为可以很容易地替换或者定制。你可以嵌入你自己的视图引擎、URL路由策略、动作方法参数序列化,以及其他组件。ASP.NET MVC框架也支持使用依赖注入(Dependency Injection,DI)和控件倒置(Inversion of Control,IOC)容器模型。DI允许你将对象注入到类中,而不是基于类来创建对象本身。IOC制定了如果一个对象需要另一个对象,第一个对象应该由外部源,例如配置文件,获得第二个对象。这使得测试更加容易。一个强大
11、的URL映射组件,允许你创建拥有着易于理解和便于搜索的URL的应用程序。URL并不需要包含文件名扩展,并且设计为有利于搜索引擎优化(SEO)和表现状态传输(representational state transfer)的URL命名模式。支持在现有的页面(.aspx文件)、用户控件(.ascx文件)和模板页(.master文件)文件中使用标记来作为视图模板。你可以与ASP.NET MVC框架一起使用现有的功能,例如嵌套模板页,in-line表达式(),声明式服务器控件、模板、数据绑定、本地化等等。支持现有的功能。ASP.NET MVC允许你使用例如表单验证和Windows验证、URL授权、成员
12、资格和角色、输出和数据缓存、会话和档案状态管理、健康监视器、配置系统和Provider架构这些的功能。2. 理解MVC应用程序执行过程对基于ASP.NET MVC的Web应用程序发出的请求首先通过UrlRoutingModule对象,它是一个 模块。这个模块对请求进行解析,并且执行路由选择。UrlRoutingModule对象选择与当前请求所匹配的第一个路由对象(路由对象十一哥实现了RouteBase的类,典型地是是一个Route类的实例)。如果没有路由匹配,UrlRoutingModule对象什么也不做,并且让请求回退到通常的或者IIS请求处理。从所选择的Route对象中,UrlRoutin
13、gModule对象获取与Route对象相关的IRouteHandler对象。典型地,在一个MVC应用程序中,这是一个MvcRouteHandler的实例。IRouteHandler实例创建了一个I Handler对象,并且向它传递I Context对象。默认情况下,MVC的I Handler实例是一个MvcHandler对象。MvcHandler对象然后选择控制器,该控制器最终处理请求。NOTE:当ASP.NET MVC应用程序运行在中时,MVC项目对文件的扩展名没有要求。然而,在中,handler要求你将.mvc文件名后缀映射到ASP.NET ISAPI DLL。模块和处理器(handler
14、)是ASP.NET MVC框架的入口点。它们执行下面的动作:在MVC Web应用程序中选择合适的控制器。获取一个特定的控制器实例。调用控制器的Execute方法。下面的表列出了MVC Web项目的执行阶段。阶段细节收到应用程序的第一个请求在文件中,Route对象添加到RouteTable对象中。执行路由UrlRoutingModule模块使用RouteTable集合中的第一个匹配的Route对象来创建RouteData对象,该对象然后被用来创建RequestContext(I Context)对象。创建MVC请求处理器MvcRouteHandler对象创建一个MvcHandler类的实例,并且
15、将RequestContext实例传递给它。创建控制器MvcHandler对象使用RequestContext实例来识别出IControllerFactory对象(典型地,是一个DefaultControllerFactory类的实例),来创建控制器实例。调用动作大多数控制器都继承自Controller基类。对于这些控制器来说,与控制器相关的ControllerActionInvoker对象决定调用控制器类的哪一个动作方法,然后调用它。执行结果一个典型的动作方法可能会接收用户输入,准备合适的响应数据,然后通过返回一个结果类型来执行结果。内置的、可以执行的结果包括下面这些:ViewResult(
16、呈现一个视图,是最常使用的结果类型),RedirectToRouteResult、RedirectResult、ContentResult、JsonResult和EmptyResult。3. 理解模型、视图和控制器这篇教程将为你提供ASP.NET MVC模型、视图、控制器的高层次概览。换言之,它解释了ASP.NET MVC中的“M”、“V”和“C”。在读完本教程之后,你应该能够理解ASP.NET MVC应用程序中的各个不同部分是如何一起工作的。你也应该能够理解ASP.NET MVC应用程序与ASP.NET Web窗体应用程序和动态服务器页面应用程序在构架上有何不同。3.1 范例ASP.NET
17、MVC应用程序Visual Studio用于创建ASP.NET MVC Web应用程序的默认模板包括了一个极其简单的范例应用程序,可以使用它来理解ASP.NET MVC应用程序的各个部分。我们将会在这篇教程中利用这个简单的应用程序。你可以通过启动Visual Studio2008,并且在菜单中选择“File(文件)”、“New Project(新建项目)”来使用MVC模板创建一个新的ASP.NET MVC应用程序(如图1)。在“新建项目”对话框,在项目类型下选择你喜欢的编程语言(Visual Basic或者C#),并且在模板下选择ASP.NET MVC Web应用程序。点击“确定”按钮。图1
18、- 新建项目对话框当你创建一个新的ASP.NET MVC应用程序时,将会出现“创建单元测试项目(Create Unit Test Project)”对话框(如图2)。这个对话框允许你在解决方案下创建一个独立的项目用于测试你的ASP.NET MVC应用程序。选择选项“No, do not create a unit test project(否,不要创建单元测试项目)”,并且点击“OK(确定)”按钮。图2 - 创建单元测试对话框在新的ASP.NET MVC应用程序创建好之后。你将会在解决方案浏览器窗口中看到几个文件夹和文件。特别地,你将会看到三个文件夹,名字是Models、Views和Contr
19、ollers。正如你从文件夹的名称可以推测出的,这三个文件夹包含了实现了模型、视图和控制器的文件。如果你展开Controller文件夹,你应该会看到一个命名为HomeContro的文件。如果你展开Views文件夹,你应该看到两个子文件夹,名称是Home和Shared。如果你展开Home文件夹,你将会再次看到两个文件,名称是和(见图3)。这些文件组成了这个包含在默认ASP.NET MVC模板中的范例应用程序。图3 - 解决方案浏览器窗口你可以通过选择菜单项“Debug(调试)”、“Start Debugging(启动调试)”来运行这个范例应用程序。除此以外,你可以点击F5键。当你第一次运行应用程
20、序,将会出现图4中的对话框,建议你开启调试模式。点击“确定”按钮将会运行应用程序。图4 - 未开启调试对话框当你运行一个ASP.NET MVC应用程序,Visual Studio会在你的web浏览器中运行应用程序。这个范例应用程序只含有两个页面:Index页面和About页面。当应用程序第一次启动时,将会显示Index页面(见图5)。你可以通过点击应用程序右上角的菜单链接导航到About页面。图5 - Index页面注意一下你浏览器地址栏中的URL。当你点击Home菜单链接,浏览器地址栏的URL将变为/Home。当你点击About菜单链接,浏览器地址栏的URL变为/About。3.2 一个UR
21、L并不等同于一个页面当你创建一个传统的ASP.NET Web窗体应用程序,或者是一个动态服务器页面(ASP)应用程序,在URL与页面之间存在一对一的对应。如果你请求服务器上的一个名为的页面,那么最好在磁盘上有一个页面。如果文件并不存在,你将会获得一个丑陋的404-页面不存在错误。当创建一个ASP.NET MVC应用程序时则大不相同,你键入到浏览器地址栏的URL与你应用程序中的文件之间并没有一个对应关系。在一个ASP.NET MVC应用程序中,一个URL与一个控制器的动作相对应,而不是磁盘上的页面。对于一个传统的或者ASP应用程序,浏览器请求被映射到了页面。在ASP.NET MVC应用程序中,浏
22、览器请求被映射到了控制器动作。一个ASP.NET Web窗体应用程序是以内容为中心的。而一个ASP.NET MVC应用程序则以是应用程序逻辑为中心的。3.3 理解URL路由一个浏览器请求通过名叫URL路由(URL Routing)的ASP.NET MVC功能被映射到了一个控制器动作。URL路由将即将到来的请求发送到了控制器动作。URL路由使用一张路由表来处理来到的请求。这个路由表在你的Web应用程序首次启动时创建。这个路由表建立在文件中。代码清单1包含了这个默认的文件。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Lin
23、q;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Routing;namespaceMvcApplication1publicclassGlobalApplication: System.Web. Application publicstaticvoidRegisterRoutes(RouteCollection routes) routes.IgnoreRoute(resource.axd/*pathInfo); routes.MapRoute(Default,controller/action/id,new controller =
24、Home, action = Index, id = ); protectedvoidApplication_Start() RegisterRoutes(RouteTable.Routes); 当应用程序第一次启动时,将调用Application_Start()方法。在代码清单1中,这个方法调用了RegisterRoutes()方法,并且RegisterRoutes()方法创建了默认的路由表。默认的路由表只含有一个路由。这个默认的路由将所有到来的请求分为了三个分段(一个URL分段是正斜杠之间的任何东西)。第一个分段映射到了控制器名称,第二个分段映射到了动作名称,最后一个分段映射到了传递给动作
25、的名为Id的参数。例如,考虑下面的URL:/Product/Details/3这个URL将会被解析为像这样的三个部分:Controller = ProductControllerAction = DetailsId = 3注意到Controller后缀被添加到了控制器参数的末尾。这只是MVC的一个怪癖而已。默认的路由包含所有三个分段的默认值。默认的控制器是HomeController,默认的动作是Index,默认的Id是一个空字符串。脑子里记下这三个默认值,考虑下面的URL是如何被解析的:/Employee这个URL将被解析为像这样的三个参数:Controller = EmployeeCont
26、rollerAction = IndexId = 最后,如果你打开一个ASP.NET MVC应用程序而不提供任何的URL(例如,),然后这个URL将会被解析成这样:Controller = HomeControllerAction = IndexId = 这个请求被发送到了HomeController类的Index()动作。3.4 理解控制器控制器负责用户与MVC应用程序交互的方式。当用户发出浏览器请求时,控制器决定向用户发回什么样的响应。控制器不过是一个类(例如,一个Visual Basic或者C#类)。这个范例ASP.NET MVC应用程序包含一个名为的控制器,它位于Controllers
27、文件夹下。的内容再次显示在了代码清单2中。代码清单2usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApplication1.ControllerspublicclassHomeController: Controller publicActionResult Index() ViewDataTitle =Home Page; ViewDataMessage =Welcome to ASP.NET MVC!;returnVie
28、w(); publicActionResult About() ViewDataTitle =About Page;returnView(); 注意到HomeController拥有两个方法,名为Index()和About()。这两个方法对应于控制器暴露出的两个动作。URL /Home/Index将会调用HomeController.Index()方法,而URL /Home/About会调用HomeController.About()方法。控制器中的任何公共方法都被暴露为一个控制器动作。对此你需要多加小心。这就意味着包含在控制器中的任何公共方法都可以由任何可以访问互联网的人调用,通过在浏览器中
29、输入正确的URL。3.5 理解视图由HomeController类暴露出的两个控制器动作,Index()和About(),都返回了一个视图。视图含有将会发送给浏览器HTML标记和内容。当使用ASP.NET MVC应用程序时,一个视图等同于一个页面。你必须在正确的位置创建你的视图。HomeController.Index()动作返回了一个位于以下路径的视图:HomeController.About()动作返回一个位于以下路径的视图:一般而言,如果你想为一个控制器动作返回一个视图,那么你需要在Views文件夹下创建一个子文件夹,这个文件夹与你的控制器同名。在子文件夹下,你必须创建一个.aspx文件
30、,它的名字与控制器动作相同。代码清单3中的文件含有视图。代码清单sterAutoEventWireup=true CodeBehind=About.aspx.cs Inherits=MvcApplication1.Views.Home.About% About Us TODO: Put about content here. 如果你忽略代码清单中的第一行,视图剩余的大部分是由标准的HTML构成的。你可以在这里输入任何你想要的HTML来修改视图的内容。视图非常类似于动态服务器页面(ASP)中的页面,或者的Web窗体。视图可以含有HTML内容和脚本。你可以使用你所喜爱的.NET语言(例如,C#或者
31、Visual Basic .Net)编写脚本。你使用脚本显示动态的内容,例如数据库数据。3.6 理解模型我们已经讨论了控制器,我们也讨论了视图。我们需要讨论的最后一个话题是模型。MVC模型是什么呢?MVC的模型包含了你应用程序中的所有逻辑,这些逻辑没有包含在视图或者控制器中。模型应该包含你的应用程序中的所有业务逻辑和数据库访问逻辑。例如,如果你使用LINQ to SQL访问数据库,那么你可以在Models文件夹中创建你的LINQ to SQL类(你的dbml文件)。视图应该仅包含与生成用户界面有关的逻辑。控制器应该仅仅只包含最少量的逻辑,用于返回正确的视图或者将用户重定向到另一个动作。任何其他
32、的事情都应该包含在模型中。通常,你应该竭尽全力创建一个丰富的模型以及一个瘦小的控制器。你的控制器方法应该只包含几行代码。如果一个控制器动作变得太丰富,那么你应该考虑将这些逻辑抽取出来放置到Models文件夹的新类中。3.7 总结这篇教程为你提供了ASP.NET MVC Web应用程序各个不同部分的一个高层次的概览。你学习了URL路由如何将即将到来的浏览器请求发往特定的控制器动作。你还学习了控制器是如何协调视图怎样返回浏览器的。最后,你学习了模型是怎样包含应用程序的业务和数据库访问逻辑的。Asp.Net MVC 控制器原文链接:HYPERLINK :/ MVC控制器(controller)、控制
33、器动作(controller action)和动作结果(action results)这几个主题。在读完本篇教程之后,你将会理解控制器如何控制访问者与ASP.NET MVC网站进行交互的方式。1.理解控制器MVC控制器负责响应对ASP.NET MVC网站发起的请求。每一个浏览器请求都映射到了一个专门的控制器。举个例子,设想一下你在浏览器地址栏输入了下面的URL: :/localhost/product/index/3在这种情况下,将会调用一个名为ProductController的控制器。ProductController负责生成对浏览器请求的响应。举个例子,控制器可能会返回一个特定的视图,或
34、者是将用户重定向到另一个控制器。你可以通过在ASP.NET MVC应用程序的Controllers文件夹下添加一个新的控制器来创建一个新控制器。右键点击控制器的文件夹,并且选择菜单项“Add(添加)”,“New(新建项)”,并选择“MVC Controller Class(MVC控制器类)”(见图1)。控制器的名字必须含有Controller后缀。举个例子,控制器名称ProductController没什么问题,但是控制器Product就不起作用。图1 创建一个新的控制器如果你创建一个新的名为ProductController的控制器,那么你将会获得代码清单1所示的文件。代码清单usingSy
35、stem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassProductController: Controller publicActionResult Index() / Add action logic herethrownewNotImplementedException(); 如同你在代码清单1中所看到的,控制器不过是一个类(Visual Basic.Net 或者是C#类)。一个控制器是一
36、个继承自基类的类。因为控制器继承自这个基类,所以控制器轻松地继承了一些有用的方法(我们不久将会讨论这些方法)。2. 理解控制器动作控制器暴露出控制器动作。动作是控制器的一个方法,当你在浏览器地址栏输入某一特定的URL时,将会调用这个方法。举个例子,假设你对下面这个URL发出请求: :/localhost/Product/Index/3在本例中,Index()方法在ProductController类上被调用。Index()方法是控制器动作的一个例子。一个控制器动作必须是控制器类的一个公共方法。C#方法,默认时,是私有方法。意识到你添加到控制器类中的任何公共方法都会自动被暴露为控制器动作(你必须
37、非常小心,因为控制器动作可以被全球的任何人调用,仅仅简单地通过在浏览器地址栏输入正确的URL)。控制器动作还要满足一些额外的需求。作为控制器动作来使用的方法不能够重载。另外,控制器动作不能为静态方法。除了这些以外,你可以将任何方法作为控制器动作来使用。3. 理解控制器结果控制器动作返回一种叫做动作结果(Action Result)的东西。动作结果是控制器动作返回给浏览器请求的东西。ASP.NET MVC框架支持六种标准类型的动作结果:ViewResult 代表HTML及标记。EmptyResult 代表无结果。RedirectResult 代表重定向到一个新的URL。RedirectToRou
38、teResult 代表重定向到一个新的控制器动作。JsonResult 代表一个JSON(Javascript Object Notation)结果,它可以用于AJAX应用程序。ContentResult 代表着文本结果。所有这些动作结果都继承自ActionResult基类。在大多数情况下,控制器动作 ViewResult。例如,代码清单2中的Index()控制器动作返回了一个ViewResult。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingeb;usingSystem.Web.Mvc;namesp
39、aceMvcApp.ControllerspublicclassBookController: Controller publicActionResult Index() returnView(); 当一个动作返回一个ViewResult,将会向浏览器返回HTML。代码清单2中的Index()方法向浏览器返回了一个名为的视图。注意到代码清单2中的Index()动作并没有放回一个ViewResult()。而是调用了Controller基类的View()方法。通常情况下,你并不直接返回一个动作结果。而是调用Controller基类的下列方法之一:View 返回一个ViewResult结果。Redi
40、rect 返回一个RedirectResult 动作结果。RedirectToAction 返回一个RedirectToAction动作结果。RedirectToRoute 返回一个RedirectToRoute动作结果。Json 返回一个JsonResult动作结果。Content 返回一个ContentResult动作结果。因此,如果你想向浏览器返回一个视图,你可以调用View()方法。如果你想要降用户从一个控制器动作重定向到另一个,你可以调用RedirectToAction()方法。举个例子,代码清单3中的Details()动作要么显示一个视图,要么将用户重定向到Index()动作,取决
41、于Id参数是否含有值。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassCustomerController: Controller publicActionResult Details(int? Id) if(Id =null)returnRedirectToAction(Index);returnView(); publicActionResult Index() retu
42、rnView(); ContentResult动作结果很特别。你可以使用ContentResult动作结果来将动作结果作为纯文本返回。举个例子,代码清单4中的Index()方法将消息作为了纯文本返回,而不是HTML。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassStatusController: Controller publicContentResult Inde
43、x() returnContent(Hello World!); 当调用StatusController.Index()动作时,并没有返回一个视图。而是向浏览器返回了原始的文本“Hello World!”。如果一个控制器动作返回了一个结果,而这个结果并非一个动作结果 例如,一个日期或者整数 那么结果将自动被包装在ContentResult中。举个例子,当调用代码清单5中的WorkController的Index()动作时,日期将自动作为一个ContentResult返回。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Li
44、nq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassWorkController: Controller publicDateTime Index() returnDateTime.Now; 代码清单5中的Index()动作返回了一个DateTime对象。ASP.NET MVC框架自动将DateTime对象转换为一个字符串,并且将DateTime值包装在一个ContentResult中。浏览器将会以纯文本的方式收到日期和时间。4. 总结这篇教程的目的是为你介绍ASP.NET MVC中控制器、控
45、制器动作以及控制器动作结果的概念。在第一部分,你学习了如何向ASP.NET MVC项目中添加新的控制器。接下来,你学习了控制器的公共方法是如何作为控制器动作暴露给全世界的。最后,我们讨论了动作结果的各种不同类型,这些动作结果可以从控制器动作中返回。特别地,我们讨论了如何从控制器动作中返回一个ViewResult、RedirectToActionResult和ContentResult。5. 创建控制器这篇教程的目的是解释如何来创建新的ASP.NET MVC控制器。你会学习如何通过Visual Studio Add Controller菜单和手工创建类文件,来创建控制器。5.1 使用Add Co
46、ntroler菜单选项创建一个新控制的最简单方法是在Visual Studio的解决方案浏览器的Controllers文件夹上点击右键,并且选择Add,Controller菜单项(如图1)。选择这个菜单项打开了Add Controller对话框(如图2)。图2:添加一个新的控制器图3:Add Controller对话框注意到控制器名称的第一部分在Add Controller对话框中高亮显示了。每一个控制器的名称必须以Controller后缀结尾。举个例子,你可以创建一个叫做ProductController的控制器,但是不能创建一个叫做Product的控制器。NOTE:如果你创建一个控制器,它
47、不含有Controller后缀,那么你将无法调用这个控制器。不要这么做 - 在犯了这个错误之后,我已经浪费了不计其数的时间。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Mvc.Ajax;namespaceMvcApplication1.ControllerspublicclassProductController: Controller / GET: /Product/publicActionResult
48、Index() returnView(); 你应该总是在Controllers文件夹中创建控制器。否则的话,就破坏了ASP.NET MVC的惯例,其他的程序员将会花费更多艰辛的时间来理解你的应用程序。5.2 创建动作方法当你创建一个控制器时,你可以选择自动生成Create,Update和Details动作方法(如图3)。如果你选择了这个选项,那么会生成代码2中的控制器类。图4:自动创建动作方法。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;
49、usingSystem.Web.Mvc.Ajax;namespaceMvcApplication1.ControllerspublicclassCustomerController: Controller / GET: /Customer/publicActionResult Index() returnView(); / GET: /Customer/Details/5publicActionResult Details(intid) returnView(); / GET: /Customer/CreatepublicActionResult Create() returnView();
50、/ POST: /Customer/Create AcceptVerbs( Verbs.Post)publicActionResult Create(FormCollection collection) try / TODO: Add insert logic herereturnRedirectToAction(Index); catch returnView(); / GET: /Customer/Edit/5 publicActionResult Edit(intid) returnView(); / POST: /Customer/Edit/5 AcceptVerbs( Verbs.P
51、ost)publicActionResult Edit(intid, FormCollection collection) try / TODO: Add update logic herereturnRedirectToAction(Index); catch returnView(); 这些生成的方法都只是一些存根方法(stub methods)。你必须自己为客户的创建、更新和显示详情添加实际的逻辑。但是,这些存根方法为你提供了一个漂亮的着手点。5.3 创建一个控制器类ASP.NET MVC控制器不过是一个类。如果你喜欢,可以无视Visual Studio便利的控制器创建方式,自己手动来创
52、建一个控制器类。按照这些步骤:右键点击Controllers文件夹,并且选择菜单项Add,New Item,然后选择Class模板。将新类命名为,然后点击Add按钮。修改产生的类文件,让这个类继承自基类(见代码清单3)。图5:创建一个新类代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;namespaceMvcApplication1.ControllerspublicclassPersonController: System.Web.Mvc.Controller publicstr
53、ingIndex() returnHello World!; 代码清单3中的控制器类公布了一个叫做Index()的动作,它返回字符串“Hello World!”。你可以通过运行应用程序,并且请求像下面这样的URL来调用这个控制器动作: :/localhost:40071/PersonNOTE:ASP.NET 开发服务器使用一个随机的端口号(例如,40071)。当输入URL来调用控制器时,你需要提供正确的端口号。你可以通过将鼠标悬停在开发服务器的图标上来获得端口号,该图标位于Windows Notification Area(Windows通知区域,屏幕的右下角)。6. 创建自定义动作本篇教程的
54、目的是解释如何创建一个新的控制器动作。你会学习到控制器动作的要求。你还会学习如何来阻止将方法公布为控制器动作。6.1 添加动作到控制器你可以通过在控制器中添加一个新的方法,将新的动作添加到控制器中。举个例子,代码清单1中的控制器包含了一个叫做Index()和一个叫做SayHello()的动作。这两个方法都公布为了动作。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespacellers HandleErrorpublicclassHo
55、meController: Controller publicActionResult Index() returnView(); publicstringSayHello() returnHello!; 为了将方法作为一个动作公布给全世界,方法必须满足特定的要求:方法必须是公共的。方法不能是静态方法。方法不能使扩展方法。方法不能是构造函数,访问器,或者设置器。方法不能拥有开放泛型类型(open generic types)。方法不能使控制器基类中的方法。方法不能含有ref或者out参数。6.2 阻止公共方法被调用如果你需要在控制器中创建一个公共方法,但是你不想将这个方法发布为控制器动作,那么
56、你可以通过使用NonAction特性来阻止该方法被外界调用。举个例子,代码清单2中的控制器含有一个叫做CompanySecrets()的公共方法,它使用NonAction特性进行了修饰。代码清单usingSystem.Web.Mvc;namespaceMvcApplication1.ControllerspublicclassWorkController: Controller NonActionpublicstringCompanySecrets() returnThis informationissecret.; 如果你试图通过在浏览器地址栏输入/Work/CompanySecrets来调
57、用CompanySecrets()控制器动作,那么你会获得图5所示的错误消息:图6: 调用一个NonAction方法Asp.Net MVC 路由原文链接:HYPERLINK :/ t _blank在这篇教程中,我将为你介绍每个ASP.NET MVC应用程序都具有的一个重要功能,称作路由(ASP.NET Routing)。路由模块负责将即将到来的浏览器请求映射到特定的MVC控制器动作。学完这篇教程之后,你将会理解标准的路由表是如何将请求映射到控制器动作的。1. 理解默认路由表当你创建一个新的ASP.NET MVC应用程序时,应用程序已经被配置为使用路由。路由在两个地方设置。第一点,在你的应用程序
58、Web配置文件(文件)中启用路由。在配置文件中有四个节点与路由有关:节,节,节,以及节。特别要小心不要删除了这些节点,因为没有它们路由将不能工作。第二点,也是更为重要的一点,在应用程序的文件中创建了一个路由表。文件是一个特殊的文件,它包含了作用于ET应用程序生命周期事件的事件处理程序。路由表在Application Start事件期间创建。代码清单1中的文件包含了一个ASP.NET MVC应用程序的默认文件。代码清单usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.W
59、eb.Mvc;usingSystem.Web.Routing;namespaceMvcApplication1/ Note: For instructions on enabling IIS6 or IIS7 classic mode,/ visit :/go.microsoft /?LinkId=9394801publicclassMvcApplication: System.Web. Application publicstaticvoidRegisterRoutes(RouteCollection routes) routes.IgnoreRoute(resource.axd/*pathInfo); routes.MapRoute(Default,/ Route namecontroller/action/id,/ URL with parametersnew controller =Home, action = Index, id = / Parameter defaults ); protectedvoidApplication_Start() RegisterRoutes(RouteTable.Routes); 当一个MVC应用程序首次运行时,会调用Application_Start()方法。这个方法随后调用了RegisterRoutes()方法。RegisterR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《普通物理实验1》课程教学大纲
- 2024年出售三房车库合同范本
- 2024年出售抵押车合同范本
- 《餐饮服务与管理》高教版(第二版)9.2餐饮安全防范单元练习卷(解析版)
- 九年级期中学情调研化学试卷
- 光伏发电行业报告:多重因素促进光伏发电行业良性发展
- 培训者应掌握的信息技术
- 关于手术电外科
- 中班艺术活动长大的我
- 2024至2030年中国高频整流机数据监测研究报告
- 2024年秋季人教版七年级上册生物全册教学课件(2024年秋季新版教材)
- 两弹一星精神(教学设计)-2023-2024学年小学科学课后服务科普课程
- 2023年下半年广西高中学业水平考试数学试卷真题(含答案详解)
- 2024-2030年农业种植行业市场发展分析及发展趋势与投资前景研究报告
- 8.1 法治国家 课件高中政治统编版必修三政治与法治
- 农小蜂-2024年中国花卉产业数据分析简报
- 2024年国家教育部留学服务中心非编招聘5人历年(高频重点复习提升训练)共500题附带答案详解
- 艺术品金融化与资产证券化
- 监视和测量设备台账
- 《水利工程建设安全生产监督检查问题清单》
- 【乡村振兴背景下农村基层治理问题探究开题报告(含提纲)3000字】
评论
0/150
提交评论