Asp.Net MVC3 简单入门详解过滤器Filter
2012-11-18 15:30:00来源:Asp.net
前言
在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码,那我们可以通过AOP截取实现,而在MVC项目中我们就可以直接使用它提供的Filter的特性帮我们解决,不用自己实现复杂的AOP了。
在Asp.net Mvc中当你有以下及类似以下需求时你可以使用Filter功能
- 判断登录与否或用户权限
- 决策输出缓存
- 防盗链
- 防蜘蛛
- 本地化与国际化设置
- 实现动态Action
第一节:知识储备
Asp.Net MVC提供了以下几种默认的Filter:
Filter Type | 实现接口 | 执行时间 | Default Implementation |
Authorization filter | IAuthorizationFilter | 在所有Filter和Action执行之前执行 | AuthorizeAttribute |
Action filter | IActionFilter | 分别在Action执行之前和之后执行。 | ActionFilterAttribute |
Result filter | IResultFilter | 分别在Action Result执行之后和之前 | ResultFilterAttribute |
Exception filter | IExceptionFilter | 只有在filter, 或者 action method, 或者 action result 抛出一个异常时候执行
| HandleErrorAttribute |
大家注意一点,Asp.Net MVC提供的ActionFilterAttribute默认实现了IActionFilter和IResultFilter。而ActionFilterAttribute是一个Abstract的类型,所以不能直接使用,因为它不能实例化,所以我们想使用它必须继承一下它然后才能使用。
Filter继承于ActionFilterAttribute抽象类,并可以覆写 void OnActionExecuting(ActionExecutingContext) 和 void OnActionExecuted(ActionExecutedContext) 以及 void OnResultExecuting(ResultExecutingContext)和 void OnResultExecuted(ResultExecutedContext)。
它们的执行先后顺序如下:
OnActionExecuting是Action执行前的操作
OnActionExecuted则是Action执行后的操作
OnResultExecuting是解析ActionResult前执行
OnResultExecuted是解析ActionResult后执行
接下来我们只要对以上的方法进行重写就可以在相应的步骤做一些操作了。
第二节:Filter实战
光说不练假把式,下面我给大家一个示例,来看看它们的执行顺序
首先添加一个普通的类,这个类要继承ActionFilterAttribute,,直接上代码了
{
public string Message { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
filterContext.HttpContext.Response.Write("Action执行之前"+Message+"<br />");
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.HttpContext.Response.Write("Action执行之后"+Message+"<br />");
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
filterContext.HttpContext.Response.Write("返回Result之前"+Message+"<br />");
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
-
无缝的缓存读取:双存储缓存策略
2009-4-2 0:27:00摘要: 最近在做一个WEB的数据统计的优化,但是由于数据量大,执行一次SQL统计要比较长的时间(一般700ms算是正常)。 阅读全文 -------------------------- 新闻
ASP.NET PowerShell Runspace Control
2010-2-4 11:16:00This is just a little concept project I am working on so I can run PowerShell scripts within my ASP
ADO.NET Data Services Update Released
2009-12-18 1:04:00A new version of the ADO.NET Data Services API was released, and you can get it from here , for th
ASP.NET Code Samples Collection - J.D. Meier's Blog - Site Home - MSDN Blogs
2011-11-22 18:47:00Read More......( read more )
How to build a cross-browser history management system
2007-9-8 4:08:00When we built the history management feature in ASP.NET Futures, we spent considerable time experim
也玩有道难题的双立方数问题:Python 版解法
2009-6-4 14:32:00发现大家都在玩这个,用 python 写了一个,计算一百万之内的数字还是飞快的(包括结果打印)。 [代码] 输出结果: [代码] ------------
【分享】一个Asp.net mvc下的分页控件MvcPagerX
2011-4-21 23:28:00分页再平常不过的需求,其实也很简单完全可以写百行以内的代码扩展到HtmlHelper上实现,但是为了扩展性,我稍微(这所以是稍微,是因为本人只稍微了解,还不敢说用得很熟练)用了点面向对象的思想对这个
微软企业库源码解析——DAAB(四)DatabaseFactory小结
2009-7-17 16:03:00经过三章的痛苦的源码解读过程,让我们来回顾一下DatabaseFactory是如何创建出正确的Database类的。 首先,给出MSDN中给出的DAAB的设计结构图 然后
北京释宇伟业最大规模
2010-1-20 16:44:00阅读: 62 评论: 1 作者: 童博士 发表于 2010-01-20 16:19 原文链接 塑料桶 北京托盘 托盘 叉车出租 叉车租赁 北京塑料
Programming for APIs
2010-7-21 11:58:00There seems to be as much or more attention paid to “Apps” these days as there is to websites.