原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.htmlhtml
有时候你想在调用action方法以前或者action方法以后处理一些逻辑。为了支持这个。ASP.NET MVC赞成你建立action过滤器。Action过滤器是本身定义的Attributes。用来标记加入Action方法以前或者Action方法以后的行为到控制器类中的Action方法中。缓存
一些可能用到Action过滤器的地方有:网络
ASP.NET MVC为咱们提供了如下的几个Filter接口:post
IActionFilter
IAuthorizationFilter
IExceptionFilter
IResultFilter
要实现一个Filter,咱们需要继承自FilterAttribute类同一时候实现上面的一个或几个接口:spa
这几个接口提供的方法例如如下:日志
上图的方法和Filter接口相应的方法按名称对号入座就可以。code
接口有两个方法:htmIActionFilter
当中OnActionExecuting在运行Action方法以前会被调用,OnActionExecuted会在Action方法运行后调用。注意他们的參数各自是ActionExecutingContext和ActionExecutedContext。blog
ActionExecutedContext类包括一个 Canceled的属性,赞成你取消当前的Action(怎么原来在P3中是在ActionExecutingContext的Canceled属性在P5中没有了呢?奇妙.那么在OnActionExecuting的时候怎么取消一个Action呢?)。继承
FilterExcutedContext 类包括一个Exception属性和一个ExceptionHandled属性。假设Exception属性为null,则没有异常在action stack中,代表Action方法执行并无错误发生。
反之则为出现异常。假设将ExceptionHandled属性设置为true则代表在这个Filter中已经处理了异常。
IResultFilter接口也提供了两个方法:
他们分别在Action返回结果(好比return View();)以前和以后运行。
和
几乎相同就很少说了。IActionFilter
IAuthorizationFilter
是一个用于身份验证的Filter。仅仅提供了一个void OnAuthorization(AuthorizationContext filterContext)方法。
IExceptionFilter
会在出现异常的时候调用,也是仅仅 提供一个void OnException(ExceptionContext filterContext)的方法;
这些Filter可以被应用在类或者方法上。如下咱们来看一下他们的运行顺序。
首先咱们写一个BaseController并加上两个Filter:
应为Controller类是实现这几个Filter接口的,因此咱们在HomeController中重写Controller基类中的所有Filter接口的方法,并在HomeController类和里面的Filter方法加上咱们本身定义的MyFilter:
而后咱们执行一下看看结果怎样:
从执行结果咱们可以看到。在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属性值。将会抛出一个异常。
来看一个演示样例:
Filter的运行顺序为:Filter3 => Filter1 => Filter2.