ASP.NET MVC 重点教程一周年版 第六回 过滤器Filter

在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能

  1. 判断登录与否或用户权限
  2. 决策输出缓存
  3. 防盗链
  4. 防蜘蛛
  5. 本地化与国际化设置 
  6. 实现动态Action

Filter是一种声明式编程方式,在Asp.net MVC中它只能限制于Action(或它的Controller)。
Filter要继承于ActionFilterAttribute抽象类,并可以覆写void OnActionExecuting(ActionExecutingContext)和
void OnActionExecuted(ActionExecutedContext)

以及void OnResultExecuting(ResultExecutingContext)和
void OnResultExecuted(ResultExecutedContext)

OnActionExecuting是Action执行前的操作,OnActionExecuted则是Action执行后的操作

而OnResultExecuting是解析ActionResult前执行,OnResultExecuted是解析ActionResult后执行。

一、应用于Action的Filter


下面我给大家一个示例,来看看它的的执行顺序
首先我们先建立 一个Filter,名字叫做TestFilter

  public class TestFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnActionExecuting<br/>";
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnActionExecuted<br/>";
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnResultExecuting<br/>";
}

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnResultExecuted<br/>";
}
}

然后建立一个Action:

        [TestFilter]//将此Filter应用于Action
public ActionResult filteraction()
{
return View();
}

 

在它的View中写入:

<%Session["temp"] += "View Execute<br/>"; %>

 

最后在其它页面得到Session["temp"]的输出结果:

TestFilter OnActionExecuting
TestFilter OnActionExecuted
TestFilter OnResultExecuting
View Execute
TestFilter OnResultExecuted

由此可得到它们的执行顺序也是如上

 

二、Controller的Filter

将Filter应用在Controller上有2种方式

1.直接将Filter应用在Controller上,如:

    [TestFilter]
public class EiceController : Controller
{
}

 

2.重写Controller内的
OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted的四个方法。

下面我们说几个系统的Filter

三、AcceptVerbs

规定页面的访问形式,如

        [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){
return View();
}


页面只能以Post形式访问,即表单提交。

四、ActionName

规定Action的名称。

应用场景:如果不想用方法名做为Action名,或Action名为关键字的话,如

       [ActionName("class")]
public ActionResult Example(){
return View();
}

 

五、NonAction

当前方法仅是普通方法不解析为Action

六、OutputCache

为Action添加缓存

        [OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult Example()
{
return View();
}

 

七、ValidateInput

该Action可以接受Html等危险代码(ASP.NET MVC在aspx中设置<%@ Page 的属性无法完成等同任务。)

        [ValidateInput(false)]
public ActionResult Example()
{
return View();
}

 

八、ValidateAntiForgeryTokenAttribute

用于验证服务器篡改。

        [ValidateAntiForgeryToken]
public ActionResult Example()
{
return View();
}
posted @ 2009-03-12 01:30 重典 阅读(10027) 评论(23) 编辑 收藏

 回复 引用 查看   
#1楼2009-03-13 12:58 | 郁闷的翩翩      
非首页沙发我也坐
 回复 引用 查看   
#2楼2009-03-24 00:50 | ziqiu.zhang      
典兄的文章我来拜读了. PS:注意两个评论的首字.
 回复 引用 查看   
#3楼[楼主]2009-03-24 07:21 | 重典      
@ziqiu.zhang
汗了。。。。藏头的。。。

 回复 引用 查看   
#4楼2009-04-16 11:06 | 风疑      
不知道为什么,我直接在view上写<%=session["temp"];%>报错,莫非必须放到类似viewdata[]中?
 回复 引用 查看   
#5楼[楼主]2009-04-16 13:18 | 重典      
@风疑
1.大小写
2.=输出与;不能兼用
<%=Session["temp"]%>

 回复 引用 查看   
#6楼2009-05-20 10:54 | 炸药3      
重典,你的MVC的视频教程不完整啊,我一天把你的视频全看完了,还有很多没出来呀。。。你是不是不打算出了呢。

请教您个MVC的技术问题,我们的网站会有多个子站,而这些子站是另一个同事用普通的WebForm做的,我用MVC做主站,然后子站以虚拟目录的形式放到主站下面,这样的话,我怎么表示它的路径呢?MVC会不会转换了?

 回复 引用   
#7楼2009-05-20 11:04 | 重典[未注册用户]
@炸药3
视频录制上传没有写文章来的轻松,呵呵

只要没有将URL写死,而全使用Helper来生成的Url就没有问题

 回复 引用 查看   
#8楼2009-05-20 13:41 | 炸药3      
@重典
重典兄,是不是没有理解我的意思呢。我的意思是说,假设我用MVC做了一个www.abc.com 然后,我同事又用webForm做了一个bbs,然后期望部署的时候访问这个BBS的路径是 www.abc.com/bbs/Index.aspx 以后类似这样访问,其他页面也一样。。。。这个能处理么?路由器里如何表示呢?

 回复 引用 查看   
#9楼2009-05-20 13:42 | 炸药3      
我去了书城,买书,找MVC的,那么大一个书城,居然一本.Net MVC的书都没有。。。。
 回复 引用 查看   
#10楼[楼主]2009-05-20 13:44 | 重典[半套狐狸]      
@炸药3
不用设置任何路由,清除Ihttphandler就行了

 回复 引用 查看   
#11楼2009-05-20 13:46 | 炸药3      
谢谢,不理解:(
你忙,不必回复我了,感谢您的热心帮助。

 回复 引用 查看   
#12楼2009-06-25 23:28 | 殷良胜      
全世界只有你的mvc博客最有价值
 回复 引用 查看   
#13楼2009-12-30 17:14 | Ares      
是你的blog教我入门mvc

受教了,谢谢传导!

 回复 引用 查看   
#14楼2010-05-05 16:01 | 骑着夕阳看着猪      
谢谢你的奉献
 回复 引用 查看   
#15楼2010-07-05 11:48 | 天地不仁      
谢谢楼主~
 回复 引用 查看   
#16楼2010-07-07 15:51 | bicabo      
public class TestFilter
这个类是创建到Controllers文件夹吗?

[TestFilter]//将此Filter应用于Action
public ActionResult filteraction()
{
return View();
}
这段代码写到哪里去?

请指教

 回复 引用 查看   
#17楼[楼主]2010-07-07 18:50 | 重典      
@bicabo
TestFilter随意写在哪里都可以

[TestFilter]写在你要验证的Action上

 回复 引用 查看   
#18楼2010-09-14 23:12 | 空呵      
我对 炸弹3 的问题很感兴趣,怎样把MVC与传统的asp.net混合使用?
 回复 引用 查看   
#19楼2010-11-02 12:22 | testzhangsan      
引用八、ValidateAntiForgeryTokenAttribute
用于验证服务器篡改。


请问“ValidateAntiForgeryTokenAttribute” 是什么意思啊?

 回复 引用 查看   
#20楼[楼主]2010-11-02 13:16 | 重典      
@testzhangsan
一个Filter用于验证客户端篡改提交页面,来做的跨站攻击

 回复 引用 查看   
#21楼2011-09-23 14:31 | 踏踏实实学编程      
<%Session["temp"] += "View Execute<br/>"; %>

这句话写在这里没有出现任何值啊。。。。

 回复 引用 查看   
#22楼2011-09-23 14:44 | 踏踏实实学编程      
还有就是如果我改成<%=Session["temp"]%>结果显示的是
TestFilter OnActionExecuting
TestFilter OnActionExecuted
TestFilter OnResultExecuting
但是没显示TestFilter OnResultExecuted,在我刷新一次后显示的是
TestFilter OnActionExecuting
TestFilter OnActionExecuted
TestFilter OnResultExecuting
estFilter OnResultExecuted
TestFilter OnActionExecuting
TestFilter OnActionExecuted
TestFilter OnResultExecuting
求指教

 回复 引用 查看   
#23楼2011-10-31 09:51 | Kingdom_0      
public class TestFilter : ActionFilterAttribute
这个TestFilter直接可以用到Action上去么 ?这个类也不是静态的。
我这里报错啊。