ASP.NET MVC 中的过滤器

这里用实例说明各种过滤器的用法,有不对的地方还请大神指出,共同探讨。

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,在所有过滤器中最先执行

猜你喜欢

转载自www.cnblogs.com/Struggle-xh/p/11400368.html