Asp.net MVC3 中,动态添加filter

filter是attribute,不支持泛型,传入的参数必须是固定的值。总之很受attribute本身的限制。

发现一篇老外的文章,动态设置filter

http://msdn.microsoft.com/en-us/magazine/gg309182.aspx

 

写一个自己的controller基类

override CreateActionInvoker方法

在此方法中返回一个自己的ActionInvoker。

可以继承MVC自带的ControllerActionInvoker

重写ActionInvoker中的GetFilters方法。除了base的以外,添加一些自己的进去

 

  1: public class MyActionInvoker : ControllerActionInvoker
  2: {
  3:     protected override FilterInfo GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
  4:     {
  5:         var filters= base.GetFilters(controllerContext, actionDescriptor);
  6:         SetFilters(filters,actionDescriptor);
  7:         return filters;
  8:     }
  9: 
 10:     public Action<FilterInfo, ActionDescriptor> SetFilters { get; set; }
 11: }

 

在自定义的controller基类中

  1: protected override IActionInvoker CreateActionInvoker()
  2: {
  3:     return new MyActionInvoker { SetFilters=SetFilters};
  4: }

在此基类中提供一个void方法,供子类重写

  1: protected virtual void SetFilters(FilterInfo filter,ActionDescriptor actionDescriptor)
  2: {}

 

在子类中重写SetFilters方法,添加或删除FilterInfo中的东西

可以通过ActionDescriptor来判断是那个action,如果需要再添加

  1: if (actionDescriptor.ActionName.ToLower() == "a")
  2: {
  3:     filter.ActionFilters.Add(new testActionFilter<int>());
  4: }

 

testActionFilter是一个泛型的,实现了IActionFilter的类。

 

这样可以动态的添加filter到某个action上。并且filter不受attribute得限制

posted @ 2011-10-24 11:56  czcz1024  阅读(460)  评论(2编辑  收藏  举报