ASP.NET MVC过滤器

在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有。园子里关于过滤器的资料也有很多,这篇文章主要是记录自己的学习。

过滤器类型

类型 接口 默认实现 执行时间 描述
 Action  IActionFilter ActionFilterAttribute  用于进入行为之前或之后的处理  方法过滤器
 Result  IResultFilter ActionFilterAttribute 用于返回结果的之前或之后的处理  结果过滤器
 Exception  IExceptionFilter

HandleErrorAttribute

用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常  异常过滤器
 Authentication  IAuthorizationFilter

AuthorizeAttribute

此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法  授权过滤器

1. Action

  •     在ASP.NET MVC项目中新建文件夹Filter,然后再在文件夹下新建类MyActionFilter,在类中添加命名空间using System.Web.Mvc,再继承自ActionFilterAttribute抽象类,我们按F12我们可以看到抽象类有四个方法,从方法的命名我们不难发现他们的执行顺序。
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
        protected ActionFilterAttribute();
        public virtual void OnActionExecuted(ActionExecutedContext filterContext);
        public virtual void OnActionExecuting(ActionExecutingContext filterContext);
        public virtual void OnResultExecuted(ResultExecutedContext filterContext);
        public virtual void OnResultExecuting(ResultExecutingContext filterContext);
    }

   MyActionFilter.cs

    public class MyActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("在Action执行后执行");
            base.OnActionExecuted(filterContext);
        }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("在Action执行前执行");
            base.OnActionExecuting(filterContext);
        }
    }
  • 过滤器可以加在三个地方,第一是控制器上面(可限制控制器下面所有的Action),第二是Action上面(限制指定的Action),第三是全局的过滤器(限制所有的Action)。

  1. 控制器上面  

         

    2.  Action上面

     

   3.   全局过滤器

   在ASP.NET MVC项目中的App_Start下新建类FilterConfig,添加静态方法RegisterGlobalFilters。

   在Global中注册RegisterGlobalFilters方法。

  

  •  运行结果

    

2. Result

  • Result作用于用于返回视图的之前或之后的处理。

     代码如下: 

        //加载试图后执行
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("加载视图后执行OnResultExecuted<br/>");
            base.OnResultExecuted(filterContext);
        }
        //加载试图前执行
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("加载视图前执行OnResultExecuting<br/>");
            base.OnResultExecuting(filterContext);
        }

     结果如下:

     

3. Exception

  •  异常过滤器最好设置成全局过滤器,记录异常日志。

     代码如下:

        /// <summary>
        /// 异常处理过滤器,最好设置成全局过滤器
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnException(ExceptionContext filterContext)
        {
            //1. 获取异常对象
            Exception ex = filterContext.Exception;
            //2. 记录异常日志
            //3. 调整友好页
            filterContext.Result = new RedirectResult("~/error.html");
            //4. 标记异常已经处理完毕
            filterContext.ExceptionHandled = true;
            base.OnException(filterContext);
        }

4. Authentication

  •  授权过滤器作用范围在Action之前
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Write("授权过滤器");
            base.OnAuthorization(filterContext);
        }

 5. 过滤器的执行顺序

原文地址:https://www.cnblogs.com/liujie2272/p/5363082.html