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得限制