技术开发 频道

ASP.NET MVC Action Filter与内置的Filter实现

  然后我们运行一下看看结果如何:

 

  从运行结果我们可以看到,在Controller中重写的Filter会最先执行,然后到应用在类上的Filter,然后再到应用在类方法上的Filter。

  而4个接口的方法执行顺序如下:IAuthorizationFilter -> IActionFilter -> IResultFilter -> IExceptionFilter .

  而对于同一个Filter,例如IAuthorizationFilter在MyFilter1和MyFilter2里里面的实现,又根据他们的加载顺序不同而不同。

  在BaseController中应用的Filter会被子类继承,如果子类又应用了和基类同样的Filter,则会不执行基类的Filter。例如上面的HomeController应用了MyFilter2,所以调用HomeController的MyFilter2,而不是BaseController的MyFilter2。

  这个执行顺序还得大家好好研究才能了解的。

  同时FilterAttribute还提供了一个Order的属性,用于指定Filter的执行顺序。

  每一个Action过滤器都有一个 Order 属性,用来决定Action过滤器在该范围内的执行顺序。Order属性必需是0(默认值)或者更大的整数值。省略Order属性则会给该过滤器的Order值为 -1, 表明未指明顺序。任何一个在同一范围的Action过滤器Order设为 -1 的都将按不确定的顺序执行,但在此之前过滤器有一个特定的顺序(请参考上图).

  当设置Order属性的值的时候,必需指定一个唯一的值。如果两个或者更多的Action过滤器具有相同的Order属性值,将会抛出一个异常。

  来看一个示例:

[Filter1(Order = 2)]
[Filter2(Order = 3)]
[Filter3(Order = 1)]
public void Index()
{
    RenderView("Index");
}
 

  Filter的执行顺序为:Filter3 => Filter1 => Filter2.

0
相关文章