理解ASP.NET MVC Framework Action Filters
原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html
本指南主要解释action filters,action filter作为一个可以应用到controller action(或者是整个controller)上的属性(Attribute),改变action执行的行为。ASP.NET MVC Framework包括几种action filters:
- OutputCache – 在指定的时间内缓存controller action的输出。
- HandleError – 处理controller action发生错误的情况。
- Authorize – 通过制定的用户或者角色约束访问权限。
你同时可以创建自己的action filter,比如说要实现一个自定义的验证系统,那么可能需要创建一个自定义的action filter,或者说当你需要改变controller action返回的view data的时候,也可以通过创建自定义action filter实现。
通过这篇指南,您可以学习到如何创建一个action filter。我们将创建一个Log action filter,用于记录action中不同处理阶段的日志,并输出到Visual Studio的Output窗口。
使用Action Filter
一个action filter是一个属性(attribute),你可以把它应用在大多数的controller action中或者整个controller上。
比如说,下图中的DataController有一个action为Index(),返回当前时间。而且这个action被OutputCache装饰了,这会造成返回值在10秒内缓存(不会有变化)。
如果一直刷新浏览器地址栏上的Url/Data/Index重复调用Index() action,你会发现在10秒内时间不会有变化,因为Index()的输出被缓存了10秒(如图)。
在上面的代码中,一个action filter:OutputCache应用在Index()方法上,如果有需要也可以应用多个action filter在同一个action上。比如说可以同时把OutputCache和HandleError作用在同一action上。
在上面的代码中,也可以直接把OutputCache直接应用到DataController类上,那样的话这个controller中所有的action都会被缓存10秒。
不同类型的Filter
ASP.NET MVC Framework支持四种不同类型的filter:
- Authorization filters – 实现
IAuthorizationFilter接口的属性. - Action filters – 实现
IActionFilter接口的属性. - Result filters – 实现
IResultFilter接口的属性. - Exception filters – 实现
IExceptionFilter接口的属性.
filter的执行顺序按上面的列表中顺序进行。如验证(authorization)filter永远都是最开始执行的,异常(exception)filter永远都是最后执行的。
验证(authorization)filter用于实现在controller action上的验证和授权,如Authorize filter就是一个验证filter的例子;
Action filter包含一些逻辑,用于该action执行之前或者之后。比如可以使用一个action filter来修改action返回的view data;
Result filter包含一些逻辑,用于该action的view result执行之前和之后。比如可以修改一个view result在view被呈现到浏览器之前;
异常(Exception)action用于处理异常信息,同样可以使用异常filter记录错误日志。
这些的filter类型是根据指定的顺序执行的,如果需要控制他们的执行顺序,需要设置filter的Order属性。
这些类的基类为System.Web.Mvc.FilterAttribute类,如果需要实现一个特定的filter类型,可以创建一个继承这个类的类,并且实现一个或多个IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。
ActionFilterAttribute基类
为了让用户更简单的创建一个自定义action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了Filter类。
这里的术语并不完全一致,从技术上说,这个类继承ActionFitlerAttribute,并且同时实现了action filter和result filter接口,但是从宽松意义上说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。
ActionFilterAttribute类有以下的方法可以重写:
- OnActionExecuting – 在controller action执行之前调用
- OnActionExecuted – 在controller action执行之后调用
- OnResultExecuting – 在controller action result执行之前调用
- OnResultExecuted – 在controller action result执行之后调用
下面会介绍如何实现这些方法。
创建一个Log Action Filter
为了阐述如何创建一个自定义的action filter,我们会创建一个自定义的action filter,用于记录controller action处理的不同阶段的日志信息,并显示到Visual Studio输出窗口中。
在上面代码中,OnActionExecuting()、OnActionExecuted()、OnResultExecuting()、OnResultExecuted()方法都调用Log()方法。把方法名称和当前route信息传递给Log()方法。Log()方法生成信息并输出到Visual Studio输出窗口中:
下图是修改后的HomeController中的代码,说明也可以把Log action filter应用到整个controller类上。每当有任何action被调用的时候,不管是Index()还是About()方法,各个处理阶段的日志都会记录到Visual Studio输出窗口中。
总结
在这篇指南中,介绍了ASP.NET MVC的action filter,了解了4种不同类型的filters,同时也了解了ActionFilterAttribute类,然后还学习了如何实现一个简单的action filter,我们创建了一个Log action filter,把action处理的各个阶段信息输出到Visual Studio的输出窗口中。
参考:http://www.cnblogs.com/shanyou/archive/2010/03/27/1698639.html
理解ASP.NET MVC Framework Action Filters的更多相关文章
- ASP.NET MVC的Action Filter
一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...
- 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
- [转载]深入理解ASP.NET MVC之ActionResult
Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, actionNam ...
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一. ASP.NET MVC 1.0 Result 几何? Action的 ...
- ASP.NET MVC Framework
ASP.NET MVC Framework是微软在ASP.NET中所添加的一组类库,这组类库可以使用Model-View-Controller的设计模式来开发ASP.NET的应用程序.它与现有的ASP ...
- 深入理解ASP.NET MVC Day1
深入理解ASP.NET MVC ASP.NET vs MVC vs WebForms 许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上 ...
- 七天学会ASP.NET MVC ——深入理解ASP.NET MVC
七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二) ...
- 深入理解ASP.NET MVC(6)
系列目录 Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, acti ...
- 深入理解ASP.NET MVC(5)
系列目录 回顾 系列的前4节深入剖析了ASP.NET URL路由机制,以及MVC在此基础上是如何实现Areas机制的,同时涉及到inbound和outbound很多细节部分.第2节中提到MvcRout ...
随机推荐
- 正确打印含unicode字符的dict
python中,dict 对象转换为类似为 \UXXXX 的格式:这种格式英文称为 code point,完全看不懂:当然,也可以通过这个网站来转换 http://rishida.net/tools/ ...
- python中读取配置文件ConfigParser
在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...
- [Prism框架实用分享]如何在主程序中合理的弹出子窗体
大家好 说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件.不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件).最 ...
- [.NET]程序在线更新,力求通用
@微微一笑 :貌似是我的第一篇博客,在外流浪了很久很久,最终还是驻留在博客园混日子吧. 在线更新,想想自己做过的项目中都有这么一个功能.虽然比较简单,但是功能还是比较重要的.抽点时间写了一个在线更新程 ...
- HDU1009
题意:有n个房子,每个房子里都有老鼠喜欢吃的咖啡豆J[i],但是每个房子都有猫看守,老鼠现在手上有M的猫粮.可以用猫粮换咖啡豆,每只猫都有猫粮的要求F[i].老鼠得到的咖啡豆是J[i]*a% ...
- 数据库事务故障恢复undo日志检查点
checkpoint 检查点 checkpoint,即检查点.在undolog中写入检查点,表示在checkpoint前的事务都已经完成commit或者rollback 了,也就是检查点前面的事务 ...
- hdu 4217 Data Structure?/treap
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 可用线段树写,效率要高点. 这道题以前用c语言写的treap水过了.. 现在接触了c++重写一遍 ...
- PHY
Linux 下smi/mdio总线通信 韩大卫@吉林师范大学 下面代码描述了在用户层访问smi/mdio总线, 读写phy芯片寄存器的通用代码.Linux内核2.6以上通用. 将下面代码编译后,将可执 ...
- java intellij 写控制台程序 窗口程序
建一个空项目,建一个main函数 用application,就可以运行了 /** * Created by robin on 15/10/11. */public class hello { pu ...
- libevent 信号示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...