• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

接上篇 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属性来定义执行顺序。
posted on 2013-08-24 14:35  HackerVirus  阅读(141)  评论(0编辑  收藏  举报

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.netcore下的如何给网站做安全设置发布时间:2022-07-10
下一篇:
ASP.NET Core 中间件之压缩、缓存发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap