词条统计
浏览次数:7399 次
编辑次数:2次 历史版本
最近更新:2013/6/20
创建者:掷鸡蛋者


Action过滤器

围绕 action 前后的过滤器,一般做成批注(Atrribute)形式,并实现 IActionFilter 接口

?

?

?

过滤器的源代码:

?

????????????IList filters = controller.GetActionFilters( actionMethod );

????????????if (filters.Count>0) {

?

????????????????for (int i = 0; i < filters.Count; i++) {

????????????????????((IActionFilter)filters[i]).BeforeAction( ctx );

????????????????}

?

????????????????try {

????????????????????controller.runAction();

????????????????}

????????????????catch (Exception ex) {

????????????????????ctx.setException( ex );

????????????????}

????????????????finally {

?

????????????????????for (int i = 0; i < filters.Count; i++) {

????????????????????????((IActionFilter)filters[i]).AfterAction( ctx );

????????????????????}

?

????????????????????throw ctx.getException();

????????????????}

?

????????????}

????????????else

????????????????controller.runAction();

?

用法

先定义一个实现了IActionFilter的批注

?

????public class MyFilterAttribute : Attribute,?IActionFilter?{

?

????????private static readonly ILog logger = LogManager.GetLogger( typeof( MyFilterAttribute ) );

?

????????public void?BeforeAction( ControllerBase?controller) {

????????????logger.Info( "开始执行。。。BeforeAction" );

????????}

?

????????public void?AfterAction( ControllerBase?controller) {

????????????logger.Info( "结束执行。。。AfterAction" );

????????}

?

????????public int Order { get; set; }

?

????}

?

?

然后将其加在控制器方法上

?

????????[MyFilter2(Order=2), MyFilter(Order=3), MyFilter3(Order=1)]

????????public void tx() {

?

????????????logger.Info( "--------- action?执行中?---------" );

?

注意:

?

bet36体育655365.com1、顺序。可以给这些attribute批注添加order属性,用于批注执行顺序的排序。如果没有设值,则order的值为0,此时多个批注执行的顺序是不确定的,可能多次执行顺序都不一样。前后执行顺序如下图所示:


?

?

2、本批注只能用在两种方法中

????a)页面被请求的主action方法

????b)各层次的layoutController的Layout方法中

?

?

使用场合和经验

?

1、需要前后执行的,比如数据库事务transaction(365最新体育网站_365体育网是假不假_365足球体育官方网站已经定义了一个DbTransactionAttribute)、或者日志、权限等

2、中途修改上下文,添加缓存、压缩,或者处理异常等等

?