博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC学习笔记-----Filter(2)
阅读量:5245 次
发布时间:2019-06-14

本文共 2883 字,大约阅读时间需要 9 分钟。

接上篇


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("
Action执行时间:{0}
" , 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属性来定义执行顺序。

转载于:https://www.cnblogs.com/hao-dotnet/p/3278765.html

你可能感兴趣的文章
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
熟用TableView
查看>>
Java大数——a^b + b^a
查看>>
poj 3164 最小树形图(朱刘算法)
查看>>
服务器内存泄露 , 重启后恢复问题解决方案
查看>>
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>