ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
原帖地址: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接口:
IActionFilterIAuthorizationFilterIExceptionFilterIResultFilter
要实现一个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实现(介绍)的更多相关文章
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自Filt ...
- [转]ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自FilterAttribute类同时实现IAction ...
- [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...
- ASP.NET MVC 入门系列教程
ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...
- 10、ASP.NET MVC入门到精通——Model(模型)和验证
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 模型就是处理业务,想要保存.创建.更新.删除的对象. 注解(通过特性实现) DisplayName Required StringLengt ...
- ASP.NET MVC 入门8、ModelState与数据验证
原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html ViewData有一个ModelState的属性,这是一个类型 ...
- ASP.NET MVC内置的Filter实现介绍
有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...
- [转]ASP.NET MVC 入门8、ModelState与数据验证
ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在使用Html. ...
- ASP.NET MVC 入门
ASP.NET MVC 入门 (Learning ASP.NET MVC) 传统的WebForm发展到如今出现不少的缺陷, 比如为了解决Http的无状态WebForm模式使用了ViewsState来保 ...
随机推荐
- android设备上运行i-jetty服务
android设备上运行i-jetty服务: 1) i-jetty安装 本人小菜一个,i-jetty源码有好几个文件,不知道怎么运行起来,于是找了一个现成可运行的i-jetty工程(感谢这位同学的分享 ...
- CentOS关闭休眠和屏保模式
CentOS关闭休眠和屏保模式 本人因为特殊需求,想让某台Linux主机始终显示某个程序,显示器不能关机或者休眠或进入屏保模式. 环境:Ubuntu 11.10 最小化模式安装并安装有轻量级桌面o ...
- 【laravel54】如果开启了自带的时间戳(Y-h-m H:s:m),getInsertId一定要手动加上created_at 和 updated_at字段填充
[laravel54]如果开启了自带的时间戳(Y-h-m H:s:m),getInsertId一定要手动加上created_at 和 updated_at字段填充
- MySQL-关于事务的使用
如果你一次执行单条查询语句, 则没有必要启用事务支持, 数据库默认支持SQL执行期间的读一致性, 如果你一次执行多条查询语句, 例如统计查询, 报表查询, 在这种场景下, 多条查询SQL必须保证整体的 ...
- 数据源与JNDI资源实现JSP数据库连接池实例
名词解释:JNDI的全称是java命名与目录接口(Java Naming and Directory Interface),是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通 ...
- iOS - Contacts 通讯录
Contacts 通讯录 1.访问通讯录 设置系统访问通讯录权限 1.1 iOS 9.0 及 iOS 9.0 之后获取通讯录的方法 iOS 9.0 及 iOS 9.0 之后获取通讯录的方法 // 包含 ...
- python学习笔记013——模块中的私有属性
1 私有属性的使用方式 在python中,没有类似private之类的关键字来声明私有方法或属性.若要声明其私有属性,语法规则为: 属性前加双下划线,属性后不加(双)下划线,如将属性name私有化,则 ...
- python学习笔记013——模块
1 模块module 1.1 模块是什么 模块是包含一系列的变量,函数,类等程序组 模块通常是一个文件,以.py结尾 1.2 模块的作用 1. 让一些相关的函数,变量,类等有逻辑的组织在一起,使逻辑更 ...
- python练习笔记——模拟双色球随机输出情况
编写Python函数:完成一个双色球彩票的模拟生成过程, 其中前六个为蓝色球,数字范围1-33,不可重复.最后一个为红色球 1-16. 使用random完成,最后将7个数进行排列放到列表中 # 引入r ...
- TCP/IP协议栈与数据报封装
一.ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardi ...