在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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得限制 |
请发表评论