MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Filter我们不得不去单独的Controller或者Action去定义
如图:
那么问题来了,我现在想在FitlerConfig里面去维护所有的过滤器,但是又想实现自定义的过滤器该咋搞,MVC默认不支持!
我们先来看看,MVC默认的Fitlers注册是怎样的
官方源码:GlobalFilterCollection.cs
1 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. 2 3 using System.Collections; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web.Mvc.Filters; 7 using System.Web.Mvc.Properties; 8 9 namespace System.Web.Mvc 10 { 11 public sealed class GlobalFilterCollection : IEnumerable<Filter>, IFilterProvider 12 { 13 private List<Filter> _filters = new List<Filter>(); 14 15 public int Count 16 { 17 get { return _filters.Count; } 18 } 19 20 public void Add(object filter) 21 { 22 AddInternal(filter, order: null); 23 } 24 25 public void Add(object filter, int order) 26 { 27 AddInternal(filter, order); 28 } 29 30 private void AddInternal(object filter, int? order) 31 { 32 ValidateFilterInstance(filter); 33 _filters.Add(new Filter(filter, FilterScope.Global, order)); 34 } 35 36 public void Clear() 37 { 38 _filters.Clear(); 39 } 40 41 public bool Contains(object filter) 42 { 43 return _filters.Any(f => f.Instance == filter); 44 } 45 46 public IEnumerator<Filter> GetEnumerator() 47 { 48 return _filters.GetEnumerator(); 49 } 50 51 IEnumerator IEnumerable.GetEnumerator() 52 { 53 return _filters.GetEnumerator(); 54 } 55 56 IEnumerable<Filter> IFilterProvider.GetFilters(ControllerContext controllerContext, 57 ActionDescriptor actionDescriptor) 58 { 59 return this; 60 } 61 62 public void Remove(object filter) 63 { 64 _filters.RemoveAll(f => f.Instance == filter); 65 } 66 67 private static void ValidateFilterInstance(object instance) 68 { 69 if (instance != null && !( 70 instance is IActionFilter || 71 instance is IAuthorizationFilter || 72 instance is IExceptionFilter || 73 instance is IResultFilter || 74 instance is IAuthenticationFilter)) 75 { 76 throw Error.InvalidOperation(MvcResources.GlobalFilterCollection_UnsupportedFilterInstance, 77 typeof(IAuthorizationFilter).FullName, 78 typeof(IActionFilter).FullName, 79 typeof(IResultFilter).FullName, 80 typeof(IExceptionFilter).FullName, 81 typeof(IAuthenticationFilter).FullName); 82 } 83 } 84 } 85 }