《MVC应用程序解读》由会员分享,可在线阅读,更多相关《MVC应用程序解读(31页珍藏版)》请在金锄头文库上搜索。
1、MVCMVC应用程序解读应用程序解读本章重点本章重点n n路由路由 n n控制器控制器 n n视图视图20.1 MVC概述概述n nMVCMVC是是Model-View-ControllerModel-View-Controller的缩写,即把一个的缩写,即把一个WebWeb应用的输应用的输入、处理、输出流程按照入、处理、输出流程按照ModelModel、ViewView、ControllerController的方式进的方式进行分离,这样一个应用被分成三个层行分离,这样一个应用被分成三个层模型层、视图层、模型层、视图层、控制层。控制层。 n n视图(视图(ViewView)代表用户交互界面,
2、对于)代表用户交互界面,对于WebWeb应用来说,可以应用来说,可以概括为概括为HTMLHTML界面,但有可能为界面,但有可能为XHTMLXHTML、XMLXML和和AppletApplet。对。对于视图的处理仅限于视图上数据的采集和处理,以及用户的于视图的处理仅限于视图上数据的采集和处理,以及用户的请求。请求。n n模型(模型(ModelModel):就是业务流程):就是业务流程/ /状态的处理以及业务规则的状态的处理以及业务规则的制定。业务流程的处理过程对其他层来说是黑箱操作,模型制定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。接受视图请求的数
3、据,并返回最终的处理结果。n n控制(控制(ControllerController)可以理解为从用户接收请求,)可以理解为从用户接收请求, 将模型与视将模型与视图匹配在一起,共同完成用户的请求。控制层并不做任何的图匹配在一起,共同完成用户的请求。控制层并不做任何的数据处理。一个模型可能对应多个视图,一个视图可能对应数据处理。一个模型可能对应多个视图,一个视图可能对应多个模型。多个模型。 20.1 MVC概述概述n n模型、视图与控制器的分离,使得一个模型可以具有多个显模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,示视图。如果用户通过
4、某个视图的控制器改变了模型的数据,所有其他依赖于这些数据的视图都应反映到这些变化。因此,所有其他依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化的视图,导致显示的更新。这实际上是一种模型的变化- -传传播机制。播机制。20.1 MVC概述概述n nMVCMVC设计模式存在如下优点:设计模式存在如下优点:1. 1.可以为一个模型在运行时同时建立和使用多个视可以为一个模型在运行时同时建立和使用多个视图。图。 2. 2.视图与控制器的可接插性,允许更换
5、视图和控制视图与控制器的可接插性,允许更换视图和控制器对象,甚至在运行期间进行对象替换。器对象,甚至在运行期间进行对象替换。 3. 3.模型的可移植性。因为模型是独立于视图的,所模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。以可以把一个模型独立地移植到新的平台工作。4. 4.潜在的框架结构。可以基于此模型建立应用程序潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。框架,不仅仅是用在设计界面的设计中。20.2 ASP.NET MVCn nASP.NET MVCASP.NET MVC框架为创建基于框架为创建基于MVCMVC设计模式
6、的设计模式的WebWeb应用程序提供了设计框架和技术基础。它是一个轻应用程序提供了设计框架和技术基础。它是一个轻量级的、高度可测试的演示框架,并且它结合了现量级的、高度可测试的演示框架,并且它结合了现有的有的ASP.NETASP.NET特性(如母版页等)。特性(如母版页等)。n nMVCMVC框架被定义在框架被定义在Sytem.Web.MvcSytem.Web.Mvc命名空间,并且是命名空间,并且是被被Sytem.WebSytem.Web命名空间所支持的。命名空间所支持的。20.2 ASP.NET MVCn nASP.NET MVCASP.NET MVC框架具有如下一些特性:框架具有如下一些特
7、性:1. 1.ASP.NET MVCASP.NET MVC框架深度整合许多用户熟悉的平台特性,框架深度整合许多用户熟悉的平台特性,如运行时、身份验证、安全性、缓存和配置特性等。如运行时、身份验证、安全性、缓存和配置特性等。2. 2.整个架构是基于标准组件的,所以开发人员可以根据自己整个架构是基于标准组件的,所以开发人员可以根据自己的需要分解或替换每个组件。的需要分解或替换每个组件。3. 3.ASP.NET MVCASP.NET MVC框架使用用户熟悉的框架使用用户熟悉的ASPXASPX和和ASCXASCX文件进行文件进行开发,然后在运行时生成开发,然后在运行时生成HTMLHTML的方式,并且实
8、现了母版的方式,并且实现了母版嵌套特性。嵌套特性。4. 4.在这个框架中,在这个框架中,URLURL将不再映射到将不再映射到ASPXASPX文件,而是映射文件,而是映射到一些控制类(到一些控制类(controller classescontroller classes)。)。5. 5.NET MVC.NET MVC框架实现了框架实现了System.Web.IHttpRequestSystem.Web.IHttpRequest和和IHttpResponseIHttpResponse接口,这使得单元测试能力得到了增强。接口,这使得单元测试能力得到了增强。6. 6.在进行测试时,不必再通过在进行测试
9、时,不必再通过WebWeb请求,单元测试可以撇开请求,单元测试可以撇开控制器而直接进行。控制器而直接进行。7. 7.可以在没有可以在没有ASP.NETASP.NET运行环境的机器上进行单元测试。运行环境的机器上进行单元测试。20.2 ASP.NET MVCn nASP.NET MVCASP.NET MVC框架应用程序则把框架应用程序则把URLsURLs映射到服务映射到服务器代码,它不是把器代码,它不是把URLsURLs映射到映射到ASP.NETASP.NET页面或处理页面或处理器,而是把器,而是把URLsURLs映射到控制器类。控制器类处理传映射到控制器类。控制器类处理传入的诸如用户输入和交互
10、请求,并执行相应的应用入的诸如用户输入和交互请求,并执行相应的应用程序和数据逻辑,最后控制器类通常调用视图组件程序和数据逻辑,最后控制器类通常调用视图组件来生成来生成HTMLHTML输出。输出。n n通过项目模板通过项目模板“ “ASP.NET MVC Web ApplicationASP.NET MVC Web Application” ”创建创建ASP.NET MVCASP.NET MVC网站时,根据网站时,根据ASP.NET MVCASP.NET MVC框架的框架的规定,规定,ASP.NET MVCASP.NET MVC应用程序将模型、视图和控制应用程序将模型、视图和控制器组件及其他内容
11、分别放在不同的项目目录中,以器组件及其他内容分别放在不同的项目目录中,以便开发者维护和管理。便开发者维护和管理。20.2 ASP.NET MVCn n利用利用ASP.NET MVCASP.NET MVC框架创建出的网站项目会自动生成这些框架创建出的网站项目会自动生成这些文件夹和文件:文件夹和文件: 1. App_Data1. App_Data文件夹文件夹 它用来存储数据,与基于它用来存储数据,与基于WebWeb表单的表单的ASP.NET WebASP.NET Web应用程序应用程序中的中的App_DataApp_Data文件夹具有相同的功能。文件夹具有相同的功能。 2. Content2. C
12、ontent文件夹文件夹 它存放应用程序需要的一些静态的资源文件,如图片、它存放应用程序需要的一些静态的资源文件,如图片、CSSCSS样式文件等。样式文件等。 3. Scripts3. Scripts文件夹文件夹 它存放它存放JavaScriptJavaScript等脚本文件。等脚本文件。 4. Models4. Models文件夹文件夹 模型组件一般存放在模型组件一般存放在ModelsModels文件夹中,例如文件夹中,例如LINQ to SQLLINQ to SQL类类或者或者ADO.NET Entity Data ModelADO.NET Entity Data Model就可以存放在该
13、目录中,该就可以存放在该目录中,该目录还可以存放有关数据访问操作的一些类、对象的定义等。目录还可以存放有关数据访问操作的一些类、对象的定义等。 20.2 ASP.NET MVC 5. Views 5. Views文件夹文件夹 视图组件一般存放在视图组件一般存放在ViewsViews文件夹中,可以存放的类型包文件夹中,可以存放的类型包括:括:.aspx.aspx页面、页面、.ascx.ascx控件及控件及.master.master母版页等。这里需要说母版页等。这里需要说明的是对每一个控制器,在明的是对每一个控制器,在ViewView文件夹中都有一个与控制文件夹中都有一个与控制器对应的目录。器对
14、应的目录。 6. Shared 6. Shared 文件夹文件夹 对于视图组件中的公用部分,可以创建一个名为对于视图组件中的公用部分,可以创建一个名为“ “SharedShared” ”的文件夹,该目录不属于单个的控制器,而是的文件夹,该目录不属于单个的控制器,而是属于所有的控制器,在属于所有的控制器,在SharedShared中可以存放母版页、中可以存放母版页、CSSCSS样式样式表等文件。表等文件。 7. Controllers7. Controllers文件夹文件夹 控制器组件一般存放在控制器组件一般存放在ControllersControllers文件夹中,控制器的命名文件夹中,控制器
15、的命名约定采用约定采用XXXControllerXXXController的方式。的方式。20.2 ASP.NET MVCn n在一个在一个MVC WebMVC Web项目执行过程中,将经历如下几个阶段:项目执行过程中,将经历如下几个阶段:1. 1. 获取第一个请求。在获取第一个请求。在Global.asaxGlobal.asax文件中,文件中,RouteRoute对象被添加到对象被添加到RouteTableRouteTable对对 象中。象中。2. 2. 执行路由。执行路由。UrlRoutingModuleUrlRoutingModule对象使用对象使用RouteTableRouteTabl
16、e集合中第一个匹配的集合中第一个匹配的 RouteRoute对象以创建对象以创建RouteDataRouteData对象,利用这个对象以生成对象,利用这个对象以生成RequestContextRequestContext对象对象 (IHttpContextIHttpContext对象)。对象)。3. 3. 创建创建MVCMVC请求处理。请求处理。MvcRouteHandlerMvcRouteHandler对象创建一个对象创建一个MvcHandlerMvcHandler类的实类的实 例,并把它传递到例,并把它传递到RequestContextRequestContext实例。实例。4. 4. 创
17、建控制器。创建控制器。MvcHandlerMvcHandler对象使用对象使用RequestContextRequestContext实例去确认实例去确认 IControllerFactoryIControllerFactory对象以创建控制器实例。对象以创建控制器实例。5. 5. 执行控制器。执行控制器。MvcHandlerMvcHandler实例调用控制器的可以执行方法。实例调用控制器的可以执行方法。6. 6. 触发行为。很多控制器都继承自触发行为。很多控制器都继承自ControllerController基础类,而同控制器结合在一基础类,而同控制器结合在一 起的起的ControllerA
18、ctionInvokerControllerActionInvoker对象来决定控制器类调用哪个方法并调用这个对象来决定控制器类调用哪个方法并调用这个 方法。方法。7. 7. 执行结果。一个典型的行为方法可能接收用户输入,准备适当响应数执行结果。一个典型的行为方法可能接收用户输入,准备适当响应数 据,并通过返回一个结果类型来执行结果。据,并通过返回一个结果类型来执行结果。20.3 路由路由 n nURLURL路由(路由(URL RoutingURL Routing),指的是在基于),指的是在基于ASP.NET MVCASP.NET MVC的的网站中,网站中,URLURL不再是文件目录中的一个文
19、件,而是一个说明不再是文件目录中的一个文件,而是一个说明有关有关URLURL路由的字符串,开发者可以自行定义该字符串的格路由的字符串,开发者可以自行定义该字符串的格式,方便使用者理解相关的页面功能。式,方便使用者理解相关的页面功能。20.3.1 20.3.1 定义路由定义路由n n定义定义URLURL路由,就是设置路由,就是设置URLURL模式。在模式。在URLURL路由中,通过大路由中,通过大括号括号“ “” ”定义占位符,这些占位符就是定义占位符,这些占位符就是URLURL路由的参数,路由的参数,而字符中的而字符中的“ “/ /”“ ”“. .” ”等符号则被作为分隔符被等符号则被作为分隔
20、符被URLURL路由解路由解析这些离散的数据,对于不在小括号或者方括号中的信息则析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量被视为一个常量 。比如:。比如: controller/action/id /controller/action/id /有效的有效的URLURL路由定义路由定义 /Products/show/beverages /Products/show/beverages /匹配的路由匹配的路由 代码说明:定义了含有代码说明:定义了含有3 3个个URLURL路由参数的路由参数的URLURL路由,此时路由,此时ProductsProducts就是控制器的名称,就
21、是控制器的名称,showshow就是该控制器中所定义的就是该控制器中所定义的一个方法,而一个方法,而beveragesbeverages则是一个则是一个id id变量。变量。 20.3 路由路由20.3.1定义路由n n路由的添加是在文件路由的添加是在文件Global.asaxGlobal.asax的的Application_StartApplication_Start事事件的处理器函数中进行的,这样可以确保当应用程件的处理器函数中进行的,这样可以确保当应用程序启动时路由是可用的,并且在对应用程序进行单序启动时路由是可用的,并且在对应用程序进行单元测试时还支持直接调用该方法。元测试时还支持直接
22、调用该方法。n n如果想在单元测试应用程序时直接调用它,那么,如果想在单元测试应用程序时直接调用它,那么,必须把注册路由的方法设置为静态的,并且为其提必须把注册路由的方法设置为静态的,并且为其提供一个参数供一个参数RouteCollectionRouteCollection。n n通过把各个路由添加到通过把各个路由添加到RouteTableRouteTable类的静态类的静态RoutesRoutes属属性中实现最终添加路由。其中,属性性中实现最终添加路由。其中,属性RoutesRoutes是一个是一个RouteCollectionRouteCollection对象,它存储了对象,它存储了ASP
23、.NETASP.NET应用程序所应用程序所有的路由。有的路由。20.3 路由路由20.3.120.3.1定义路由定义路由n n文件文件Global.asaxGlobal.asax中的代码片断:中的代码片断: protected void Application_Start(object sender, EventArgs e) protected void Application_Start(object sender, EventArgs e) RegisterRoutes(RouteTable.Routes); RegisterRoutes(RouteTable.Routes); publ
24、ic static void RegisterRoutes(RouteCollection routes) public static void RegisterRoutes(RouteCollection routes) routes.Add(new Route(routes.Add(new Route( “ “Category/action/categoryNameCategory/action/categoryName” ”/定义路由方式定义路由方式 , new CategoryRouteHandler()/, new CategoryRouteHandler()/默认路由默认路由 );
25、); 代码说明:添加了一个代码说明:添加了一个RouteRoute对象,此对象中定义了两个名字,对象,此对象中定义了两个名字,分别为分别为actionaction和和categoryNamecategoryName的的URLURL参数。参数。20.3 路由路由20.3.2 20.3.2 默认的路由默认的路由n n当定义一个路由时,可以把一个默认的值赋给一个参数。当定义一个路由时,可以把一个默认的值赋给一个参数。如果如果URLURL中没有提供此参数值,那么将使用此默认值。为中没有提供此参数值,那么将使用此默认值。为一个路由设置默认值,可以通过把一个字典赋值给一个路由设置默认值,可以通过把一个字典
26、赋值给RouteRoute类的类的DefaultsDefaults属性来实现。属性来实现。 Defaults = new RouteValueDictionary/Defaults = new RouteValueDictionary/默认的地址默认的地址 categoryName, food, action, showcategoryName, food, action, show 代码说明:创建了所定义的代码说明:创建了所定义的URLURL路由参数的默认值,即路由参数的默认值,即categoryNamcategoryNam变量的默认值是变量的默认值是food,food,而而ActionAc
27、tion方法则是对应控方法则是对应控制器中的制器中的showshow方法。方法。 20.3 路由路由20.3.3 20.3.3 使用路由使用路由1. 1. 设定默认的设定默认的URLURL路由路由在通过在通过ASP.NET MVCASP.NET MVC项目模板所建立的一个基本项目模板所建立的一个基本MVCMVC网站中,在网站中,在Global.asaxGlobal.asax文件中就已经设定了默认的文件中就已经设定了默认的URLURL路由,以便我们即刻运行所建立路由,以便我们即刻运行所建立的的MVCMVC网站网站: : (1 1)默认的)默认的URLURL模式模式: controller/act
28、ion/id : controller/action/id 默认值:默认值:action=Index Id=nullaction=Index Id=null (2 2)默认的)默认的URLURL模式模式: Default.aspx : Default.aspx 默认值:默认值:controller=Home action=Index Id=nullcontroller=Home action=Index Id=null2. 2. 添加路由添加路由添加路由最简单的方法是使用位于命名空间添加路由最简单的方法是使用位于命名空间System.Web.MvcSystem.Web.Mvc中的中的Route
29、CollectionExtensionRouteCollectionExtension静态类,在这个类中针对路由集合静态类,在这个类中针对路由集合RouteCollectionRouteCollection扩展了二个方法扩展了二个方法: : (1 1)IgnoreRoute()IgnoreRoute()方法主要用于设置不需要使用路由解析的方法主要用于设置不需要使用路由解析的URLURL地址,地址, 有二个重载的方法。有二个重载的方法。 (2 2)MapRoute()MapRoute()方法则用于设置各种的路径,一共有方法则用于设置各种的路径,一共有6 6个重载的方法。个重载的方法。20.4 构
30、建模型构建模型n n在ASP.NET MVC框架中,模型主要实现应用程序中数据访问和业务逻辑,按照规定,这些模型类均存放在Models文件夹中。n n我们可以使用各种各样不同的技术来实现数据访问和业务逻辑。比如Microsoft Entity Framework、NHibernate、Subsonic或者ADO.NET类来构建的数据访问类。n n最为常用的是LINQ to SQL类和ADO.NET Entity Data Model。 20.5 控制器控制器 n n在在ASP.NET MVCASP.NET MVC中,控制器有着非常重要的作用,中,控制器有着非常重要的作用,控制器处理用户的请求,
31、将用户请求的控制器处理用户的请求,将用户请求的URLURL路由,路由,分发到控制器中的相关动作方法并执行适当的业务分发到控制器中的相关动作方法并执行适当的业务逻辑。控制器类通常调用一个单独的视图组件来生逻辑。控制器类通常调用一个单独的视图组件来生成成HTMLHTML标记以对请求做出反应。标记以对请求做出反应。20.5.1 控制器类n n所有控制器的基类都是所有控制器的基类都是ControllerController类,这个类提供通类,这个类提供通用的用的MVCMVC处理功能。处理功能。ControllerController类实现了类实现了IControllerIController、IAct
32、ionFilterIActionFilter和和IDisposableIDisposable接口。接口。20.5 控制器控制器20.5.1 20.5.1 控制器类控制器类n nControllerController基类负责以下处理阶段:基类负责以下处理阶段:1. 1.定位适当的行为方法。定位适当的行为方法。2. 2.获取行为方法参数的值。获取行为方法参数的值。3. 3.处理在执行行为方法过程中可能出现的所有错误。处理在执行行为方法过程中可能出现的所有错误。4. 4.提供默认的提供默认的WebFormViewFactoryWebFormViewFactory类以用来渲染类以用来渲染ASP.NE
33、TASP.NET页面类型页面类型( (视图视图) )。 以下代码展示了一个名为以下代码展示了一个名为HomeControllerHomeController的控制器类的定义的控制器类的定义 : public class HomeController : Controllerpublic class HomeController : Controller public ActionResult Index() public ActionResult Index() ViewDataMessage = ViewDataMessage = 欢迎学习欢迎学习ASP.NET MVC!;ASP.NET M
34、VC!; return View(); return View(); 20.5 控制器控制器20.5.2 ActionResult20.5.2 ActionResult类型类型n nActionResultActionResult是一个抽象类,因此实际返回的类型是该抽象类是一个抽象类,因此实际返回的类型是该抽象类的子类。的子类。ActionResultActionResult的子类有如下表所示的子类有如下表所示: :20.5 控制器控制器20.5.3 20.5.3 行为方法行为方法n n使用使用ASP.NET MVCASP.NET MVC应用程序的用户交互则围绕控制器及其中的行为方法应用程序的
35、用户交互则围绕控制器及其中的行为方法进行组织。进行组织。n n行为方法是在控制器中定义的。通常,行为中针对每一个用户的交互都行为方法是在控制器中定义的。通常,行为中针对每一个用户的交互都创建一个一一对应的映射,用户的交互包括在浏览器中输入一个创建一个一一对应的映射,用户的交互包括在浏览器中输入一个URLURL,点击一个链接,以及提交一个表单,等等。每一个这类的用户交互都会点击一个链接,以及提交一个表单,等等。每一个这类的用户交互都会导致把一个请求发送到服务器。而请求导致把一个请求发送到服务器。而请求URLURL中都会包括相应的信息以便中都会包括相应的信息以便MVCMVC框架来调用一个相应的行为
36、方法。框架来调用一个相应的行为方法。n n下面这段代码定义了一个控制器,并在该控制器中定义了一个名为下面这段代码定义了一个控制器,并在该控制器中定义了一个名为“ “HelloHello” ”行为方法:行为方法: public class MyController : Controllerpublic class MyController : Controller public ActionResult Hello()/ / public ActionResult Hello()/ /控制器方法控制器方法 return View(HelloWorld); return View(HelloWor
37、ld); 20.6 视图视图 n nASP.NET MVCASP.NET MVC框架提供一个视图引擎以生成视图。默框架提供一个视图引擎以生成视图。默认情况下,认情况下,MVCMVC框架使用定制的类型来生成视图,而框架使用定制的类型来生成视图,而这个类型继承自已经存在的这个类型继承自已经存在的ASP.NETASP.NET页面(页面(.aspx.aspx)、)、母版页(母版页(.master.master)和用户控件()和用户控件(.ascx.ascx)。)。n n一般情况下,在基于一般情况下,在基于MVCMVC的的WebWeb工程构架中,把视图工程构架中,把视图全部放到全部放到ViewsView
38、s文件夹的下面。根据文件夹的下面。根据MVCMVC框架要求,框架要求,视图中不应该包含任何应用程序逻辑或数据库检索代视图中不应该包含任何应用程序逻辑或数据库检索代码。码。n n借助于控制器行为方法提供的与借助于控制器行为方法提供的与MVCMVC视图相关的数据视图相关的数据对象,由视图负责渲染相应的用户接口界面。对象,由视图负责渲染相应的用户接口界面。20.6 视图视图n n视图页面是一个视图页面是一个ViewPageViewPage类,这个类继承自类,这个类继承自PagePage类,类,并实现并实现IViewDataContainerIViewDataContainer接口。接口。IViewD
39、ataContainerIViewDataContainer接口提供了一个接口提供了一个ViewDataViewData属性,属性,这个属性返回一个这个属性返回一个ViewDataDictionaryViewDataDictionary对象,这个对象,这个对象包含视图要显示的数据。对象包含视图要显示的数据。n n可以使用可以使用ASP.NET WebASP.NET Web应用程序项目中提供的模应用程序项目中提供的模板来创建视图。默认情况下,视图是一个由板来创建视图。默认情况下,视图是一个由MVCMVC框架渲染的框架渲染的ASP.NET WebASP.NET Web页面。页面。MVCMVC框架利
40、用框架利用URLURL路由来决定调用哪个控制器行为,而控制器路由来决定调用哪个控制器行为,而控制器行为决定要渲染哪个视图。行为决定要渲染哪个视图。20.7 行为过滤器行为过滤器 n n行为过滤器是行为过滤器是ASP.NET MVCASP.NET MVC中一个非常有用的扩中一个非常有用的扩展,允许在对展,允许在对MVCMVC控制器的请求中注入拦截代码,控制器的请求中注入拦截代码,这些代码在这些代码在ControllerController和它的和它的ActionAction方法执行的前后方法执行的前后执行,这样就可以以一种非常干净、声明的方式执行,这样就可以以一种非常干净、声明的方式轻松地封装和
41、重用功能。轻松地封装和重用功能。n n行为过滤器继承自行为过滤器继承自ActionFilterAttributeActionFilterAttribute类。可以通类。可以通过行为过滤器特性来标记任何行为方法或控制器过行为过滤器特性来标记任何行为方法或控制器以表明行为过滤器应用于该方法或该控制器内的以表明行为过滤器应用于该方法或该控制器内的所有方法。所有方法。20.7 行为过滤器行为过滤器n nASP.NET MVC 2ASP.NET MVC 2提供了四种类型的行为过滤器:提供了四种类型的行为过滤器:1. 1. 授权(授权(AuthorizeAuthorize),该过滤器用来限制进入控制),该
42、过滤器用来限制进入控制器或控制器行为。器或控制器行为。2. 2. 处理错误(处理错误(HandleErrorHandleError),该过滤器用来指定一),该过滤器用来指定一个行为,这个行为用来处理某个行为方法中抛出个行为,这个行为用来处理某个行为方法中抛出的异常。的异常。3. 3. 缓存输出(缓存输出(OutputCacheOutputCache),该过滤器用来为行为),该过滤器用来为行为方法提供输出缓存。方法提供输出缓存。4. 4. 自定义过滤器,自定义过滤器允许开发人员自己自定义过滤器,自定义过滤器允许开发人员自己创建行为过滤器以执行所需要的功能。比如自定创建行为过滤器以执行所需要的功能
43、。比如自定义的过滤器包括日志、权限、本地化以及认证功义的过滤器包括日志、权限、本地化以及认证功能。能。20.7 行为过滤器行为过滤器20.7.1 Authorize20.7.1 Authorize过滤器过滤器n n当使用当使用AuthorizeAuthorize特性标记一个行为方法时候,该方法的进特性标记一个行为方法时候,该方法的进入就被限制为被认证和被授权的用户。如果一个控制器被入就被限制为被认证和被授权的用户。如果一个控制器被AuthorizeAuthorize过滤器特性所标记,则该控制器内所有行为方法过滤器特性所标记,则该控制器内所有行为方法的访问都具有限制性。的访问都具有限制性。n n
44、AuthorizeAuthorize特性让开发人员指明行为方法被限制于那些预定特性让开发人员指明行为方法被限制于那些预定义的角色或用户,这样程序员就具有了允许用户查看网站义的角色或用户,这样程序员就具有了允许用户查看网站内页面的最大的控制权限。内页面的最大的控制权限。n n如果一个未被授权的用户试图进入被如果一个未被授权的用户试图进入被AuthorizeAuthorize特性标记的特性标记的行为方法,行为方法,MVCMVC框架就会抛出框架就会抛出401 HTTP401 HTTP状态码。如果网状态码。如果网站被配置为使用站被配置为使用ASP.NETASP.NET表单认证,表单认证,401401状
45、态码将会把用状态码将会把用户导航到登录页面。户导航到登录页面。20.7 行为过滤器行为过滤器20.7.1 Authorize过滤器n nAuthorize过滤器的实现依赖于AuthorizeAttribute类。该类设置了两个属性,分别是Users和Roles,分别表示成员的用户名和角色。通过对这两个属性的控制完成成员和角色的验证功能。20.7 行为过滤器行为过滤器20.7.2 OutputCache过滤器 n nOutputCacheOutputCache过滤器实现的主要功能是借用了过滤器实现的主要功能是借用了ASP.NET 2.0ASP.NET 2.0中的页面缓存机制,实现中的页面缓存机制
46、,实现ASP.NET ASP.NET MVCMVC网站中指定页面的缓存,从而提高网站的性网站中指定页面的缓存,从而提高网站的性能。能。n n一般来说,在控制器或者控制器内的行为方法上,一般来说,在控制器或者控制器内的行为方法上,设置设置OutputCacheOutputCache属性,便在该属性中指定相关属性,便在该属性中指定相关的缓存参数;还可以在视图页面中,直接设置缓的缓存参数;还可以在视图页面中,直接设置缓存参数;或者在存参数;或者在Web.configWeb.config配置文件中设置相关的配置文件中设置相关的缓存参数。缓存参数。20.7 行为过滤器行为过滤器20.7.2 Output
47、Cache20.7.2 OutputCache过滤器过滤器n nOutputCachOutputCach过滤器的实现是通过过滤器的实现是通过OutputCachAttributeOutputCachAttribute类,该类,该类中有多个属性如下表所示:类中有多个属性如下表所示:20.7 行为过滤器行为过滤器20.7.3 HandleError过滤器n nHandleErrorHandleError过滤器可以指定如何处理行为方法中抛过滤器可以指定如何处理行为方法中抛出的异常。默认情况下,如果一个被标记了出的异常。默认情况下,如果一个被标记了HandleErrorHandleError属性的行为
48、方法抛出任何异常,属性的行为方法抛出任何异常,MVCMVC框框架都会显示应用程序目录下架都会显示应用程序目录下“ “ViewView” ”文件夹中文件夹中“ “SharedShared” ”文件夹内的文件夹内的“ “Error.aspxError.aspx” ”视图。视图。n nHandleErrorHandleError过滤器的实现是通过过滤器的实现是通过HandleErrorAttributeHandleErrorAttribute类,该类提供了如下几个属性:类,该类提供了如下几个属性:1. ExceptionType1. ExceptionType:指定过滤器要处理的异常类型。如:指定过滤器要处理的异常类型。如果该属性未被指定,则过滤器处理所有的异常。果该属性未被指定,则过滤器处理所有的异常。2. View2. View:指定要显示的视图的名称。:指定要显示的视图的名称。3. Master3. Master:指定要使用的母版视图的名称。:指定要使用的母版视图的名称。4. Order4. Order:指定过滤器被应用的顺序。:指定过滤器被应用的顺序。结束结束