原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html

本指南主要解释action filters,action filter作为一个可以应用到controller action(或者是整个controller)上的属性(Attribute),改变action执行的行为。ASP.NET MVC Framework包括几种action filters:

  • OutputCache – 在指定的时间内缓存controller action的输出。
  • HandleError – 处理controller action发生错误的情况。
  • Authorize – 通过制定的用户或者角色约束访问权限。

你同时可以创建自己的action filter,比如说要实现一个自定义的验证系统,那么可能需要创建一个自定义的action filter,或者说当你需要改变controller action返回的view data的时候,也可以通过创建自定义action filter实现。

通过这篇指南,您可以学习到如何创建一个action filter。我们将创建一个Log action filter,用于记录action中不同处理阶段的日志,并输出到Visual Studio的Output窗口。

使用Action Filter

一个action filter是一个属性(attribute),你可以把它应用在大多数的controller action中或者整个controller上。

比如说,下图中的DataController有一个action为Index(),返回当前时间。而且这个action被OutputCache装饰了,这会造成返回值在10秒内缓存(不会有变化)。

如果一直刷新浏览器地址栏上的Url/Data/Index重复调用Index() action,你会发现在10秒内时间不会有变化,因为Index()的输出被缓存了10秒(如图)。

在上面的代码中,一个action filter:OutputCache应用在Index()方法上,如果有需要也可以应用多个action filter在同一个action上。比如说可以同时把OutputCache和HandleError作用在同一action上。

在上面的代码中,也可以直接把OutputCache直接应用到DataController类上,那样的话这个controller中所有的action都会被缓存10秒。

不同类型的Filter

ASP.NET MVC Framework支持四种不同类型的filter:

  1. Authorization filters – 实现IAuthorizationFilter接口的属性.
  2. Action filters – 实现IActionFilter接口的属性.
  3. Result filters – 实现IResultFilter接口的属性.
  4. Exception filters – 实现IExceptionFilter接口的属性.

filter的执行顺序按上面的列表中顺序进行。如验证(authorization)filter永远都是最开始执行的,异常(exception)filter永远都是最后执行的。

验证(authorization)filter用于实现在controller action上的验证和授权,如Authorize filter就是一个验证filter的例子;

Action filter包含一些逻辑,用于该action执行之前或者之后。比如可以使用一个action filter来修改action返回的view data;

Result filter包含一些逻辑,用于该action的view result执行之前和之后。比如可以修改一个view result在view被呈现到浏览器之前;

异常(Exception)action用于处理异常信息,同样可以使用异常filter记录错误日志。

这些的filter类型是根据指定的顺序执行的,如果需要控制他们的执行顺序,需要设置filter的Order属性。

这些类的基类为System.Web.Mvc.FilterAttribute类,如果需要实现一个特定的filter类型,可以创建一个继承这个类的类,并且实现一个或多个IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。

ActionFilterAttribute基类

为了让用户更简单的创建一个自定义action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了Filter类。

这里的术语并不完全一致,从技术上说,这个类继承ActionFitlerAttribute,并且同时实现了action filter和result filter接口,但是从宽松意义上说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。

ActionFilterAttribute类有以下的方法可以重写:

  • OnActionExecuting – 在controller action执行之前调用
  • OnActionExecuted – 在controller action执行之后调用
  • OnResultExecuting – 在controller action result执行之前调用
  • OnResultExecuted – 在controller action result执行之后调用

下面会介绍如何实现这些方法。

创建一个Log Action Filter

为了阐述如何创建一个自定义的action filter,我们会创建一个自定义的action filter,用于记录controller action处理的不同阶段的日志信息,并显示到Visual Studio输出窗口中。

在上面代码中,OnActionExecuting()、OnActionExecuted()、OnResultExecuting()、OnResultExecuted()方法都调用Log()方法。把方法名称和当前route信息传递给Log()方法。Log()方法生成信息并输出到Visual Studio输出窗口中:

下图是修改后的HomeController中的代码,说明也可以把Log action filter应用到整个controller类上。每当有任何action被调用的时候,不管是Index()还是About()方法,各个处理阶段的日志都会记录到Visual Studio输出窗口中。

总结

在这篇指南中,介绍了ASP.NET MVC的action filter,了解了4种不同类型的filters,同时也了解了ActionFilterAttribute类,然后还学习了如何实现一个简单的action filter,我们创建了一个Log action filter,把action处理的各个阶段信息输出到Visual Studio的输出窗口中。

参考:http://www.cnblogs.com/shanyou/archive/2010/03/27/1698639.html

理解ASP.NET MVC Framework Action Filters的更多相关文章

  1. ASP.NET MVC的Action Filter

    一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...

  2. 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

    系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...

  3. [转载]深入理解ASP.NET MVC之ActionResult

    Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, actionNam ...

  4. ASP.NET MVC – 关于Action返回结果类型的事儿(上)

    原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一.         ASP.NET MVC 1.0 Result 几何? Action的 ...

  5. ASP.NET MVC Framework

    ASP.NET MVC Framework是微软在ASP.NET中所添加的一组类库,这组类库可以使用Model-View-Controller的设计模式来开发ASP.NET的应用程序.它与现有的ASP ...

  6. 深入理解ASP.NET MVC Day1

    深入理解ASP.NET MVC   ASP.NET vs MVC vs WebForms 许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上 ...

  7. 七天学会ASP.NET MVC ——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC   系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二) ...

  8. 深入理解ASP.NET MVC(6)

    系列目录 Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, acti ...

  9. 深入理解ASP.NET MVC(5)

    系列目录 回顾 系列的前4节深入剖析了ASP.NET URL路由机制,以及MVC在此基础上是如何实现Areas机制的,同时涉及到inbound和outbound很多细节部分.第2节中提到MvcRout ...

随机推荐

  1. 【linux命令系列】熟练运用每一个光标移动到最前和最后

    ctrl+e?a和e      ahead 和 end 看一个真正的专家操作命令行绝对是一种很好的体验-光标在单词之间来回穿梭,命令行不同的滚动.在这里强烈建立适应GUI节目的开发者尝试一下在提示符下 ...

  2. 别跟我来这套 Hot Swap 热插拔

    如果你觉得我们演的不好,可以随时打断,如果你觉得怎么演好可以随时来改,你都可以直接来演.

  3. 使用 Bumblebee 控制 NVIDIA 双显卡

    简介 Nvidia的双显卡切换技术叫Optimus(擎天柱),可惜只能在win7.vista下实现.Linux下没有对应的技术,当然苹果也没有.这导致独立显卡一直在启用,显卡发热升温,风扇狂转,却没有 ...

  4. wordpress 为文章内容添加自动过滤,例如为出站链接添加nofollow,也可以将淘宝客链接转换。。

    做seo的都明白,反向链接对与网站的优化有着很重要的作用,是搜索引擎给网站排名的一个重要因素.为了添加反向链接,SEO作弊者会在论坛和博客等大量发布带无关链接的 内容.这些垃圾链接的存在给搜索引擎对网 ...

  5. Android实现简单拨号器

    Android实现简单拨号器 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 界面布局只有GridLayout和EditText两个控件,全部 ...

  6. 零基础学习Linux(一)环境搭建

    从本文开始我会为大家介绍一下linux环境下详细的集群环境安装.配置.部署到实例演示的整个过程.在此过程中会给大家详细介绍一下Linux的操作技巧和一些工具的使用.今天开始第一步——环境搭建. 第一步 ...

  7. 【收藏】Linux添加/删除用户和用户组

    1.建用户: adduser phpq                             //新建phpq用户 passwd phpq                               ...

  8. 四则运算出题器(C++)-BUG修复

    定制题目数量这个功能测试: (1)输入题目数为负数时: 可正确处理: (2)输入题目数量为0时: 可正确处理: (3)输入题目数量为小数时: 程序运行出错: 错误分析: 因为代码中题目数量的变量Que ...

  9. valueOf跟toString区别

    1.用法如下:toString()方法:返回对象的字符串表示. 对象 操作 Array 将 Array 的元素转换为字符串.结果字符串由逗号分隔,且连接起来. Boolean 如果 Boolean 值 ...

  10. Nginx问题总汇

    http://blog.csdn.net/llnara/article/details/8691049 关键字: open var run nginx pid failed 产生原因:添加模块,重编译 ...