Phil Haack 最近写了一篇博客文章来处理这个确切的场景:
ASP.NET MVC 3 中的条件过滤器
他的解决方案包括编写一个自定义的“条件过滤器提供程序”,它允许将过滤条件指定给操作方法的属性。
细节和推理在他的帖子里,但是代码比较简单。首先,创建过滤器提供程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
public class ConditionalFilterProvider : IFilterProvider {
private readonly
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions;
public ConditionalFilterProvider(
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions)
{
_conditions = conditions;
}
public IEnumerable<Filter> GetFilters(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor) {
return from condition in _conditions
select condition(controllerContext, actionDescriptor) into filter
where filter != null
select new Filter(filter, FilterScope.Global, null);
}
}
然后应用它:
IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions =
new Func<ControllerContext, ActionDescriptor, object>[] {
(c, a) => c.Controller.GetType() != typeof(HomeController) ?
new MyFilter() : null,
(c, a) => a.ActionName.StartsWith("About") ? new SomeFilter() : null
};
var provider = new ConditionalFilterProvider(conditions);
FilterProviders.Providers.Add(provider);