Phil Haack wrote a blog post recently related to this exact scenario:
Conditional filters in ASP.NET MVC 3
His solution includes a user-defined “conditional filter provider” record that allows you to assign a filter condition to the attributes of an action method.
Details and reasoning are in his post, but the code is relatively simple. First create a filter provider:
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); } }
And then applying it:
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);
Eric King
source share