词条统计
浏览次数:6231 次
编辑次数: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 执行中 ---------" );

 

注意:

 

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


 

 

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

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

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

 

 

使用场合和经验

 

1、需要前后执行的,比如数据库事务transaction(框架已经定义了一个DbTransactionAttribute)、或者日志、权限等

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