全局过滤器中排除指定Controller和action方法

********Asp.net MVC4中过滤器可以有三个级别,分别是:

1 全局过滤器

2 Controller过滤器

3 Action过滤器

 

********如果我们定义3个相应的过滤器:

1 MyGlobalFilterAttribute:ActionFilterAttribute

2 MyControllerFilterAttribute:ActionFilterAttribute

3 MyActionFilterAttribute:ActionFilterAttribute

 

********然后在调用这3个过滤器

1 在FilterConfig的RegisterGlobalFilters中

  filters.Add(new MyGlobalFilterAttribute());

2 在指定Controller上面添加属性

    [MyControllerFilterAttribute()]

3 在指定Controller的指定Action的上面添加属性

    [MyActionFilterAttribute()]

 

********指定Action的过滤器执行的结果,3个过滤器都被执行了。

1 先执行MyGlobalFilterAttribute的OnActionExecuting方法

2 其次执行MyControllerFilterAttribute的OnActionExecuting方法

3 最后执行MyActionFilterAttribute的OnActionExecuting方法

 

********疑问?我想在某个Action上不执行MyGlobalFilterAttribute的OnActionExecuting方法可以吗?

可以实现,但是比较麻烦,下面有个解决的方案

http://www.cnblogs.com/yangda/archive/2013/03/19/2968655.html

但是我很懒,我想用一种更便捷的方法实现。

 

********我的方案

1 删除MyControllerFilterAttribute和MyActionFilterAttribute这2个过滤器,只要一个就够了。

2 在MyGlobalFilterAttribute类中添加一个属性

public string Message { get; set; }

3 在Action上这样定义过滤器

[MyActionFilterAttribute(Message = "return")]

4 在FilterConfig的RegisterGlobalFilters中这样添加全局过滤器

  filters.Add(new MyGlobalFilterAttribute() {Message = "全局"});

5 在MyGlobalFilterAttribute的OnActionExecuting方法中加入判断

if(Message=="return")

{

    ​return;

}

6 在MyGlobalFilterAttribute上面定义这样的属性

[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]

 

**********然后神奇的事情就发生了,哈哈,大功告成!

 

posted @ 2014-09-27 18:39  westfruit  阅读(1190)  评论(0)    收藏  举报