• ASP.NET MVC学习笔记-----Filter2


    ASP.NET MVC学习笔记-----Filter(2)

    接上篇 ASP.NET MVC学习笔记-----Filter(1)


    Action Filter
    Action Filter可以基于任何目的使用,它需要实现IActionFilter接口:
    复制代码
    public interface IActionFilter
    {
         void OnActionExecuting(ActionExecutingContext filterContext);
         void OnActionExecuted(ActionExecutedContext filterContext);
    }
    复制代码
    顾名思义,OnActionExecuting方法将在Action方法执行前调用,而OnActionExecuted方法将在Action方法执行后调用。
     
    我们可以看到,OnActionExecuting方法的参数filterContext的类型为ActionExecutingContext,它同样继承于ControllerContext,并额外提供了Result属性和ActionDesciptor属性,它们的作用在上篇已经介绍过。
     
    同样,OnActionExecuted方法的参数filterContext的类型为ActionExecutedContext,继承于ControllerContext,额外提供了Result属性,ActionDescriptor属性和Exception属性(Action方法抛出的未处理异常).
     
    多说无益,来看一个例子吧:
    复制代码
         public class CustomerActionAttribute : FilterAttribute, IActionFilter
         {
            private Stopwatch timer;
    
            public void OnActionExecuting( ActionExecutingContext filterContext)
            {
                timer = Stopwatch .StartNew();
            }
            public void OnActionExecuted( ActionExecutedContext filterContext)
            {
                timer.Stop();
    
                if (filterContext.Exception == null )
                {
                    filterContext.HttpContext.Response.Write(
                            string .Format("<div>Action执行时间:{0}</div>" , timer.Elapsed.TotalSeconds));
                }
            }
        }
    复制代码
    复制代码
         public class HomeController : Controller
         {
            [CustomerAction]
            public ViewResult Index()
            {
                return View();
            }
    
        }
    复制代码

    执行结果:

    Result Filter
    Result Filter跟Action Filter有些类似,但它是在ActionResult执行前后执行,Result Filter需要实现IResultFilter接口:
    复制代码
    public interface IResultFilter
    {
         void OnResultExecuting(ResultExecutingContext filterContext);
         void OnResultExecuted(ResultExecutedContext filterContext);
    }
    复制代码
     
    ActionFilterAttribute
    ASP.NET MVC提供了ActionFilterAttribute,它是一个抽象类,继承FilterAttribute,实现IActionFilter和IResultFilter接口:
    复制代码
    public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter
    {
         public virtual void OnActionExecuting(ActionExecutingContext filterContext)
         {
         }
    
         public virtual void OnActionExecuted(ActionExecutedContext filterContext)
         {
         }
    
         public virtual void OnResultExecuting(ResultExecutingContext filterContext)
         {
         }
    
         public virtual void OnResultExecuted(ActionExecutingContext filterContext)
         {
         }
    }
    复制代码
    感觉这个类,就是给我们提供方便的,让我们能根据需要重写相应的方法。
     
    Global Filter 
    如果我们需要将一个Filter作用于所有的Controller和Action的话,我们可以在FilterConfig.cs中的RegisterGlobalFilters方法注册全局Filter:
    复制代码
       public class FilterConfig
        {
            public static void RegisterGlobalFilters( GlobalFilterCollection filters)
            {
                filters.Add( new HandleErrorAttribute ());
                filters.Add( new CustomerActionAttribute ());
            }
        }
    复制代码
    Filter 的执行顺序
    总的来说(相同类型的Filter),Global Filter最先执行,随后执行的是作用于Controller的Filter,最后执行的是作用于Action的Filter。但是Exception Filter的执行顺序却是完全相反的。
    如果是针对同一个Action或Controller的多个Filter(filer的类型相同),它们的执行顺序是未定的。但是我们可以通过指定Order属性来定义执行顺序。
     
     
     
  • 相关阅读:
    Codeforces Round #364
    HDU5727 Necklace
    bzoj4578: [Usaco2016 OPen]Splitting the Field
    Codeforces Round #363 (Div. 1) C. LRU
    BestCoder Round #84
    2014 Multi-University Training Contest 2
    php中 new self 和 new static的区别
    浏览器带着cookie去访问服务器,取出的数据为空
    左边用0填充补齐
    centos7修改密码
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3279297.html
Copyright © 2020-2023  润新知