这里用实例说明各种过滤器的用法,有不对的地方还请大神指出,共同探讨。
1. ActionFilter 方法过滤器:
接口名为 IActionFilter ,在控制器方法调用前/后执行。
在新建的MVC程序中,添加一个类 MyFilter1Attribute 并继承ActionFilterAttribute抽象类
从上图可以看到 ActionFilterAttribute 中的所有方法,且有相应的介绍,我们可以通过继承 ActionFilterAttribute 类,并重写(override)它的方法,从而实现自定义Filter
public class MyFilter1Attribute: ActionFilterAttribute { /// <summary> /// 该方法会在Action方法执行之前调用 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在Ation方法调用前执行<br/>"); base.OnActionExecuting(filterContext); } /// <summary> /// 该方法会在Action方法执行之后调用 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuted,我在Action方法调用后执行<br/>"); base.OnActionExecuted(filterContext); } }
然后创建一个HomeController控制器,并添加FilterTest的测试Action
public class HomeController : Controller { public ActionResult Index() { return View(); } [MyFilter1] public void FilterTest() { Response.Write("我是Action方法,我在这里执行了.....<br/>"); } }
运行程序并访问FilterTest方法:
上图可看出它的一个执行顺序
到时有时候也有可能有这样的场景:当检查到Action有标识某个Attribute的时候,我们需要跳出,并不执行后续的方法的情况,我们可以通过filterContext中ActionDescriptior类中的IsDefained方法进行判断检查
/// <summary> /// 该方法会在Action方法执行之前调用 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("我是OnActionExecuting,我在Ation方法调用前执行<br/>"); //判断Action方法时是否有贴上MyFilter1Attribute标签 if (filterContext.ActionDescriptor.IsDefined(typeof(MyFilter1Attribute), false)) { //如果有,为该Action方法直接返回ContentResult,则该Action方法在这里就有了返回值,相当于在这里就结束了,不会再去执行之后的方法,例如:OnActionExecuted filterContext.Result = new ContentResult(); } base.OnActionExecuting(filterContext); }
2.ResultFilter 结果过滤器:
接口名为 IResultFilter,在控制器方法调用完,跳转至View页面前/后调用
3.ExceptionFilter 异常操作过滤器:
接口名为 IExceptionFilter,在控制器的Action方法抛出异常时执行
4.AuthorizationFilter 授权过滤器:
接口名为 IauthorizationFilter,在所有过滤器中最先执行