在ActionInvoker执行Action的过程中,除了使用ActionDescriptor执行Action方法,以及之前对Model的绑定和验证之外,还有一个重要的任务,就是相关Filter的执行。ASP.NET MVC的过滤器是基于面向方面编程的设计。我们在相应的过滤器中实现一些非业务逻辑,然后以横切的方式将其应用到相应的Action方法中。这些过滤器在Action方法执行前后自动执行。ASP.NET MVC提供了四种类型的过滤器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter),分别对应相应的过滤器接口(IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter)。[本文已同步至《How ASP.NET MVC Works?》]
目录
一、过滤器
第二,筛选器提供程序
Iii .FilterAttribute和FilterAttributeFilterProvider
四.控制器和控制器实例筛选器提供程序
动词(verb的缩写)GlobalFilterCollection
不及物动词示例演示:验证Filter的供应机制和执行顺序
一、过滤器
虽然ASP.NET MVC提供的四种类型的过滤器都有自己的接口,但是所有的过滤器都是用过滤器类型来表示的,过滤器提供者系统的定义如下。Filter的核心是Instance属性,因为它表示真正实现过滤功能的对象,该对象基于上述四种过滤器类型实现一个或多个接口。
公共类筛选器{ public const int DefaultOrder=-1;公共筛选器(对象实例,筛选器范围,int?订单);公共对象实例{ get受保护的集合;} public int Order { get受保护的集合;} public FilterScope Scope { get受保护的集合;} }公共枚举筛选器范围{操作=30,控制器=20,第一个=0,全局=10,最后一个=100}注意:自系统。Web.Mvc.Filter以及实现IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter的类型都可以称为“Filters”,为了避免混淆,我们用英文的“Filter”和中文的“Filter”分别表示,没有明确说明。
过滤器的顺序和范围属性最终决定了过滤器的执行顺序。Order属性对应的值越小,执行优先级越高,该属性的默认值为-1(对应Filter中定义的常量DefaultOrder)。如果两个“过滤器”具有相同的“顺序”属性值,则“范围”属性最终会决定先执行哪个。筛选器的范围属性类型是筛选器范围类型的枚举。枚举指示应用过滤器的范围,操作和控制器表示操作方法和控制器类级别。“第一个”和“最后一个”表示您希望作为第一个和最后一个过滤器执行;全局代表全局过滤器。
从上面的代码片段中,我们可以看到FilterScope的五个枚举选项都设置了一个值,这个值决定了Filter的执行顺序,较小的枚举值会先执行。从FilterScope的定义中,我们可以得出结论:应用于Controller的Filter比应用于Action方法的Filter具有更高的执行优先级,全局Filter比基于Action的Filter具有更高的执行优先级。
第二,筛选器提供程序
Filter的提供机制类似于前面介绍的基于ModelBinder和ModelValidator的提供机制,都是由对应的提供者提供的。提供筛选器的FilterProvider实现接口IFi