MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Filter我们不得不去单独的Controller或者Action去定义

如图:

实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

那么问题来了,我现在想在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 }
View Code

相关文章:

  • 2022-02-09
  • 2022-02-09
  • 2021-06-28
  • 2022-02-09
  • 2022-02-09
  • 2022-02-09
猜你喜欢
  • 2022-02-09
  • 2021-09-27
  • 2021-09-27
  • 2021-09-27
  • 2021-09-27
相关资源
相似解决方案