ASP.NET MVC中使用拦截器

本文 ASP.NET MVC中使用拦截器摘要: ASP.NET MVC框架内置了拦截Action的机制。确切的分为:Action拦截器Result拦截器Exception拦截器三种。所谓 ASP.NET MVC拦截器,就是一个普通的类,该类须要继承FilterAttribute基类,Action拦截器还要实现IActionFilter接口,而Exception拦截器须要实现IExceptionFilter接口。html

        Action执行过滤的接口为:IActionFilter它有两个方法,OnActionExecuted:做用是Action执行后过滤;OnActionExecutingAction执行前过滤。而FilterAttribute表示用在属性上的成员筛选器。app

 
    1、日志拦截器
这个类继承了FilterAttribute并实现了接口的IActionFilter的两个方法:OnActionExecuting在被拦截Action前执行了准备写入日志操做,OnActionExecuted在被拦截Action后执行操做完成日志。两个方法都有一个参数,虽然类型不一样,但其实都是一个做用:被拦截Action的上下文。
 
    2、异常拦截器
 
异常拦截器同样须要继承FilterAttribute,可是不要实现IActionFilter,而是要实现IExceptionFilter接口,这个接口只有一个方法:OnException,顾名思义,固然是发生异常时被调用了。咱们看看我让它作了什么:首先将异常信息(ExceptionContext同样也是上下文,而其成员的Exception就是一个Exception类型的实例,就是被抛出的异常)记录到ViewData相应的键值里,而后咱们要呈现Error这个视图。
注意!这里已经不是Controller里了,而是另外一个类,因此固然不能调用View方法返回ViewResult实例了。咱们只好新建一个ViewResult实例,并将其视图名设为Error,将上下文中的DataView传过去。
最后那行filterContext.ExcepitonHandled = true;很重要,这行的意思是告诉系统,异常已经处理,不要再次处理了。
使用拦截器当然很爽,可是要注意两个地方:
1.Action拦截器的做用范围
除了用Action拦截器标记一个Action方法外,你也能够用来标记一个完成的控制器类。若是这样的话,这个Action拦截器将会应用到该控制器的全部Action方法上。
另外,若是你的控制器类继承自别的控制器类,而基控制器类可能有它本身的Action拦截器Attributes。若是你在子类中重写了基控制器类的Action方法,则子类的该Action方法也会有它本身的从基类继承而来的Action拦截器Attributes。
2.Action拦截器的执行顺序
每个Action拦截器都有一个 Order 属性,用来决定Action拦截器在该范围内的执行顺序。Order属性必需是0(默认值)或者更大的整数值。省略Order属性则会给该拦截器的Order值为 -1, 代表为指明顺序。任何一个在同一范围的Action拦截器Order设为 -1 的都将按不肯定的顺序执行,单在此以前拦截器有一个特定的顺序(注:下面会说到).
当设置Order属性的值的时候,必需指定一个惟一的值。若是两个或者更多的Action拦截器具备相同的Order属性值,将会抛出一个异常。
来看一个示例:
[Filter1(Order 2)]
[Filter2(Order
 3
)]
[Filter3(Order
 1)]
public void 
Index()
{
    RenderView(
"Index"
);
}
Filter的执行顺序为:Filter3 => Filter1 => Filter2.
 
综上所述,使用拦截器显而易见的优势:
1. 解决了部分代码重复的问题。不少日志处理代码和异常处理代码是很类似的,这样就致使了各个Action中存在大量重复代码。
2. 职责的明确化。 Controller仅仅是控制器,只负责表示逻辑,而不该该被一大堆日志处理代码和try...catch块包围。咱们要的Action,应该是干净的、工整的、仅包含表示逻辑的Action。
3. 代码更加优雅。
 
 固然了,也有他的缺点,在 ASP.NET MVCController中一个Action最好不要超过2,3个帽子(拦截器或过滤器),不然性能会受到影响。
 
关于更多的 业务组件的内容,你们能够访问 http://www.po-soft.com/
相关文章
相关标签/搜索