ASP.NET MVC中有四种过滤器类型

在ASP.NET MVC中有四种过滤器类型html

 Action

一、在ASP.NET MVC项目中,新建文件夹Filter,而后新建类MyCustormFilter,继承自ActionFilterAttribute类,咱们来看下ActionFilterAttribute类有以下四个方法,从命名我应该就能够看出他们的执行时机。asp.net

复制代码
复制代码
  public class MyCustormFilter:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("Action执行前");
            base.OnActionExecuting(filterContext);
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("Action执行后");
            base.OnActionExecuted(filterContext);
        }
    }
复制代码
复制代码

二、对于过滤器,咱们能够把它们加在三个地方,一个是控制器上面(控制器下面的全部Action),一个是Action上面(指定标识的Action),另外一个就是全局位置(全部控制器中的Action)。这里我只演示在Action上面加ide

复制代码
复制代码
       [MyCustormFilter]
        public ActionResult Index()
        {
            return View();
        }
       public ActionResult Index1()
       {
           return View();
}   
复制代码
复制代码

三、build而后运行ui

Result

 一、新建类TestResultFilter,继承ActionFilterAttributespa

复制代码
复制代码
  public class TestResultFilter:ActionFilterAttribute
    {
        /// <summary>
        /// 加载 "视图" 前执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext)
        {
            filterContext.HttpContext.Response.Write("加载视图前执行 OnResultExecuting <br/>");
            base.OnResultExecuting(filterContext);
        }

        /// <summary>
        /// 加载"视图" 后执行
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Write("加载视图后执行 OnResultExecuted <br/>");
            base.OnResultExecuted(filterContext);
        }
    }
复制代码
复制代码

二、这里我把TestResultFilter过滤器加在控制器上面.net

复制代码
复制代码
  [TestResultFilter]
    public class FilterTestController : Controller
    {
       [MyCustormFilter]
        public ActionResult Index()
        {
            return View();
        }
       public ActionResult Index1()
       {
           return View();
       }
    }
复制代码
复制代码

三、运行看下结果3d

注意:Result过滤器,不管Action的返回类型为何(甚至void)都将执行。日志

RouteData中保存了当前请求匹配的路由信息和路由对象code

修改MyCustormFilter.csorm

复制代码
复制代码
 public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //1.获取获取请求的类名和方法名
            string strController = filterContext.RouteData.Values["controller"].ToString();
            string strAction = filterContext.RouteData.Values["action"].ToString();//2.另外一种方式 获取请求的类名和方法名
            string strAction2 = filterContext.ActionDescriptor.ActionName;
            string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;

            filterContext.HttpContext.Response.Write("Action执行前</br>");
            filterContext.HttpContext.Response.Write("控制器:" + strController + "</br>");
            filterContext.HttpContext.Response.Write("控制器:" + strController2+"</br>");
            filterContext.HttpContext.Response.Write("Action:" + strAction + "</br>");
            filterContext.HttpContext.Response.Write("Action:" + strAction2 + "</br>");
            base.OnActionExecuting(filterContext);
        }
复制代码
复制代码

 

AuthorizeAttribute

一、  新建TestAuthorizeAttribute

复制代码
复制代码
    /// <summary>
    /// 受权过滤器 --在Action过滤器前执行
    /// </summary>
    public class TestAuthorizeAttribute:AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Write("<br/>OnAuthorization<br/>");
            //注释掉父类方法,由于父类里的 OnAuthorization 方法会调用asp.net的受权验证机制!
            //base.OnAuthorization(filterContext);
        }
}
复制代码
复制代码

二、在控制器FilterTest中的Index上添加TestAuthorize标记

复制代码
复制代码
       [MyCustormFilter]
       [TestAuthorize]
        public ActionResult Index()
        {
            return View();
        }
复制代码
复制代码

运行看下结果:

Exception

一、新建TestHandleError.cs

复制代码
复制代码
    /// <summary>
    /// 异常处理 过滤器
    /// </summary>
    public class TestHandleError : HandleErrorAttribute
    {
        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);
        }
    }
复制代码
复制代码

二、在Action上面加TestHandleError

复制代码
复制代码
  [TestHandleError]
       public ActionResult GetErr()
       {
           int a = 0;
           int b = 1 / a;
           return View();
       }
复制代码
复制代码

注意:一般这样的异常处理咱们是放在全局过滤器上面的。

复制代码
复制代码
   public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            //添加全局过滤器
            filters.Add(new TestHandleError());
        }
    }
复制代码
复制代码
相关文章
相关标签/搜索