1 namespace System.Web.Mvc { 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Web.Mvc.Async; 6 7 public class FilterAttributeFilterProvider : IFilterProvider { 8 private readonly bool _cacheAttributeInstances; 9 FilterAttributeFilterProvider()10 public FilterAttributeFilterProvider() 11 : this(true) { 12 } 13 FilterAttributeFilterProvider(bool cacheAttributeInstances)14 public FilterAttributeFilterProvider(bool cacheAttributeInstances) { 15 _cacheAttributeInstances = cacheAttributeInstances; 16 } 17 GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor)18 protected virtual IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { 19 return actionDescriptor.GetFilterAttributes(_cacheAttributeInstances); 20 } 21 GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor)22 protected virtual IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { 23 return actionDescriptor.ControllerDescriptor.GetFilterAttributes(_cacheAttributeInstances); 24 } 25 GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)26 public virtual IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { 27 ControllerBase controller = controllerContext.Controller; 28 if (controller == null) { 29 return Enumerable.Empty<Filter>(); 30 } 31 32 var typeFilters = GetControllerAttributes(controllerContext, actionDescriptor) 33 .Select(attr => new Filter(attr, FilterScope.Controller, null)); 34 var methodFilters = GetActionAttributes(controllerContext, actionDescriptor) 35 .Select(attr => new Filter(attr, FilterScope.Action, null)); 36 37 return typeFilters.Concat(methodFilters).ToList(); 38 } 39 } 40 } 41