ASP.NET MVC允许你创建action过滤器。Action过滤器是自定义的Attributes,用来标记添加Action方法之前或者Action方法之后的行为到控制器类中的Action方法中。 一些可能用到Action过滤器的地方有: 日志,异常处理 IActionFilter public class MyFilter : FilterAttribute, IActionFilter, IResultFilter
上图的方法和Filter接口对应的方法按名称对号入座就可以。 IActionFilter接口有两个方法:
其中OnActionExecuting在执行Action方法之前会被调用,OnActionExecuted会在Action方法执行后调用。注意他们的参数分别是ActionExecutingContext和ActionExecutedContext。 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: [MyFilter2(Target = "BaseController")] HomeController protected override void OnActionExecuted(ActionExecutedContext filterContext) protected override void OnActionExecuting(ActionExecutingContext filterContext) protected override void OnAuthorization(AuthorizationContext filterContext) protected override void OnException(ExceptionContext filterContext) protected override void OnResultExecuted(ResultExecutedContext filterContext) protected override void OnResultExecuting(ResultExecutingContext filterContext)
从运行结果我们可以看到,在Controller中重写的Filter会{zx0}执行,然后到应用在类上的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属性的值的时候,必需指定一个{wy}的值。如果两个或者更多的Action过滤器具有相同的Order属性值,将会抛出一个异常。 来看一个示例: [Filter1(Order = 2)] |