全局过滤器中排除指定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)]
**********然后神奇的事情就发生了,哈哈,大功告成!

浙公网安备 33010602011771号