Asp.net MVC源码分析 -- Filter 以及调用优先级

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 04:20 点击:

在Asp.net MVC 框架中一共有四种型的Filter,它们分别是

1.IActionFilter

2.IAuthorizationFilter

3.IExceptionFilter

4.IResultFilter

别外再加上一个GlobalFilters.Filters全局的,看起来挺多但是基本上这些Filter都与Action的调用有关,

让我沿着Mvc3.0源码一一找出它们的线索。

首先让我们看FilterProviders.cs,这是一个全局的系统默认FilterFilter provider,当然们也可以向里面加自定义的provider.

FilterProviders.cs

  

 1 namespace System.Web.Mvc {

 2     public static class FilterProviders {

 3         static FilterProviders() {

 4             Providers = new FilterProviderCollection();

 5             Providers.Add(GlobalFilters.Filters);

 6             Providers.Add(new FilterAttributeFilterProvider());

 7             Providers.Add(new ControllerInstanceFilterProvider());

 8         }

 9

10         public static FilterProviderCollection Providers {

11             get;

12             private set;

13         }

14     }

15 }

这里面最为重要的是FilterAttributeFilterProvider,它提供了找出Action所有在元数据中Filter的功能方法。

FilterAttributeFilterProvider.cs

  

 1   public class FilterAttributeFilterProvider : IFilterProvider {

 2         private readonly bool _cacheAttributeInstances;

 3

 4         public FilterAttributeFilterProvider()

 5             : this(true) {

 6         }

 7

 8         public FilterAttributeFilterProvider(bool cacheAttributeInstances) {

 9             _cacheAttributeInstances = cacheAttributeInstances;

10         }

11

12         protected virtual IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {

13             return actionDescriptor.GetFilterAttributes(_cacheAttributeInstances);

14         }

15

16         protected virtual IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {

17             return actionDescriptor.ControllerDescriptor.GetFilterAttributes(_cacheAttributeInstances);

18         }

19

20         public virtual IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {

21             ControllerBase controller = controllerContext.Controller;

22             if (c

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • C#高级编程:数据库连接[1]
    • asp.net 设置GridView的选中行的实现代码
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET&#160;GridView列表代码示例
    • 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transforma
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1