原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html

有时候你想在调用action方法之前或者action方法之后处理一些逻辑。为了支持这个。ASP.NET MVC同意你创建action过滤器。Action过滤器是自己定义的Attributes。用来标记加入Action方法之前或者Action方法之后的行为到控制器类中的Action方法中。

一些可能用到Action过滤器的地方有:

  • 日志,异常处理
  • 身份验证和授权 - 限制用户的訪问
  • 输出缓存 - 保存一个Action的结果
  • 网络爬虫的过滤
  • 本地化
  • 动态Action - 将一个Action注入到控制器中

ASP.NET MVC为我们提供了以下的几个Filter接口:

  • IActionFilter
  • IAuthorizationFilter
  • IExceptionFilter
  • IResultFilter

    要实现一个Filter,我们须要继承自FilterAttribute类同一时候实现上面的一个或几个接口:

    public class MyFilter : FilterAttribute, IActionFilter, IResultFilter
    {

    这几个接口提供的方法例如以下:

    上图的方法和Filter接口相应的方法按名称对号入座就能够。

    IActionFilter接口有两个方法:

    当中OnActionExecuting在运行Action方法之前会被调用,OnActionExecuted会在Action方法运行后调用。注意他们的參数各自是ActionExecutingContext和ActionExecutedContext。

    ActionExecutedContext类包括一个 Canceled的属性,同意你取消当前的Action(怎么原来在P3中是在ActionExecutingContext的Canceled属性在P5中没有了呢?奇妙.那么在OnActionExecuting的时候怎么取消一个Action呢?)。

    FilterExcutedContext 类包括一个Exception属性和一个ExceptionHandled属性。假设Exception属性为null,则没有异常在action stack中,表明Action方法执行并没有错误发生。

    反之则为出现异常。假设将ExceptionHandled属性设置为true则表明在这个Filter中已经处理了异常。

    IResultFilter接口也提供了两个方法:

    他们分别在Action返回结果(比如return View();)之前和之后运行。

    IActionFilter几乎相同就不多说了。

    IAuthorizationFilter是一个用于身份验证的Filter。仅仅提供了一个void OnAuthorization(AuthorizationContext filterContext)方法。

    IExceptionFilter会在出现异常的时候调用,也是仅仅 提供一个void OnException(ExceptionContext filterContext)的方法;

    这些Filter能够被应用在类或者方法上。以下我们来看一下他们的运行顺序。

    首先我们写一个BaseController并加上两个Filter:

    [MyFilter2(Target = "BaseController")]
    [MyFilter1(Target="BaseController")]
    public class BaseController : Controller

    应为Controller类是实现这几个Filter接口的,所以我们在HomeController中重写Controller基类中的全部Filter接口的方法,并在HomeController类和里面的Filter方法加上我们自己定义的MyFilter:

    HomeController

    然后我们执行一下看看结果怎样:

    从执行结果我们能够看到。在Controller中重写的Filter会最先执行,然后到应用在类上的Filter。然后再到应用在类方法上的Filter。

    而4个接口的方法运行顺序例如以下:IAuthorizationFilter -> IActionFilter -> IResultFilter -> IExceptionFilter .

    而对于同一个Filter。比如IAuthorizationFilter在MyFilter1和MyFilter2里里面的实现,又依据他们的载入顺序不同而不同。

    在BaseController中应用的Filter会被子类继承。假设子类又应用了和基类相同的Filter。则会不运行基类的Filter。比如上面的HomeController应用了MyFilter2,所以调用HomeController的MyFilter2。而不是BaseController的MyFilter2。

    这个运行顺序还得大家好好研究才干了解的。

    同一时候FilterAttribute还提供了一个Order的属性,用于指定Filter的运行顺序。

    每个Action过滤器都有一个 Order 属性。用来决定Action过滤器在该范围内的运行顺序。Order属性必需是0(默认值)或者更大的整数值。省略Order属性则会给该过滤器的Order值为 -1, 表明未指明顺序。

    不论什么一个在同一范围的Action过滤器Order设为 -1 的都将按不确定的顺序运行,但在此之前过滤器有一个特定的顺序(请參考上图).

    当设置Order属性的值的时候,必需指定一个唯一的值。假设两个或者很多其它的Action过滤器具有同样的Order属性值。将会抛出一个异常。

    来看一个演示样例:

    
    [Filter1(Order = 2)]
    [Filter2(Order = 3)]
    [Filter3(Order = 1)]
    public void Index()
    {
        RenderView("Index");

    Filter的运行顺序为:Filter3 => Filter1 => Filter2.

  • ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)的更多相关文章

    1. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

      于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自Filt ...

    2. [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

      前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自FilterAttribute类同时实现IAction ...

    3. [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

      有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...

    4. ASP.NET MVC 入门系列教程

      ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...

    5. 10、ASP.NET MVC入门到精通——Model(模型)和验证

      本系列目录:ASP.NET MVC4入门到精通系列目录汇总 模型就是处理业务,想要保存.创建.更新.删除的对象. 注解(通过特性实现) DisplayName Required StringLengt ...

    6. ASP.NET MVC 入门8、ModelState与数据验证

      原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html ViewData有一个ModelState的属性,这是一个类型 ...

    7. ASP.NET MVC内置的Filter实现介绍

      有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...

    8. [转]ASP.NET MVC 入门8、ModelState与数据验证

      ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在使用Html. ...

    9. ASP.NET MVC 入门

      ASP.NET MVC 入门 (Learning ASP.NET MVC) 传统的WebForm发展到如今出现不少的缺陷, 比如为了解决Http的无状态WebForm模式使用了ViewsState来保 ...

    随机推荐

    1. miniupnpc

      upnp端口映射: http://bbs.csdn.net/topics/70382968 UPnP端口映射实现过程(二) http://blog.csdn.net/jiuaiwo1314/artic ...

    2. 禁止CloudStack删除Xenserver原有虚拟机

      CloudStack在文档中指明需要加入一台干净的Xenserver作为hyperviser. 但是实际使用中,总会存在不同的需求,很多场景是试用CloudStack接管当前已有的hyperviser ...

    3. 电脑PE系统工具

      自己收集的一些PE电脑维护工具 电脑店PE工具 http://u.diannaodian.com/ 通用PE工具箱 http://www.tongyongpe.com/ 大白菜PE工具 http:// ...

    4. A Package Manager for Xcode -Xcode模板管理工具Alcatraz使用

      一款功能强大的Xcode模板管理工具 一:安装之后的效果图 二:安装 1:先关闭 xcode 2:  打开 terminal 3:  复制粘贴运行如下代码 mkdir -p ~/Library/App ...

    5. Hibernate(九)HQL查询

      一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

    6. gradle 添加jar依赖,执行grade build时出现“程序包不存在”问题

      引用的第三方依赖的包都找不到了 解决办法 group'com.suneony' version'1.0.0' apply plugin:'java' repositories { mavenLocal ...

    7. POSIX 线程详解

      一种支持内存共享的简捷工具 POSIX(可移植操作系统接口)线程是提高代码响应和性能的有力手段.在本系列中,Daniel Robbins 向您精确地展示在编程中如何使用线程.其中还涉及大量幕后细节,读 ...

    8. promise 承诺

      概念 ES6 原生提供了 Promise 对象. 所谓 Promise,就是一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API, ...

    9. idea 配置多个tomcat

        1.打开设置窗口 File-->Settings 2.启用tomcat 3.run-->edit configuration: 3.点击左上角+号-->找到Tomcat Serv ...

    10. JSTL fmt:formatNumber 数字、货币格式化

      <fmt:formatNumber value="12.34" pattern="#0.00" /> 12.34 保留小数点后两位数 <fmt ...