那么下面我们看看什么是“过滤器”。从名字上看“过滤器”的意思是就是把一些不需要东西给过滤掉,其实就像我们平时的下水管道一样,有一个过滤网,这个过滤网就是把一下事物残渣过滤掉,防止堵塞下水管道。那么在ASP.NETMVC中的“过滤器”也是这个作用。
只不过在ASP.NETMVC过滤器中所过滤的不是水,而是一个HttpRequest.而食物残渣就好比是HttpRequest所带的数据,我们可以定义一下过滤器的规则,把不需要的数据给过滤掉,只把合法的数据传递到服务器中并处理。
在Asp.netMvc中当你有以下及类似以下需求时你可以使用Filter功能
2.决策输出缓存
3.防盗链
4.防蜘蛛
5.本地化与国际化设置
6.实现动态Action
上面说了那么多文字内容,可能还是不是很清楚过滤器所处的位置,那么下面我们通过一个图来了解一下这个“过滤器”。
这个图是老魏自己画的,没有采用微软的图。在浏览器发送请求的时候,这个请求会会在执行Action之前先过滤一下这个请求,把合法内容留下并传递给Aciton执行,当执行完毕之后服务器把处理结果发送给浏览器之前也就是执行Action之后还得在经历一个过滤器,这个过滤器可以什么都不做,也可以对Action的执行结果进行修改再次的发送给浏览器。这个就是过滤器的执行过程。
在APS.NETMVC中提供几种默认的过滤器。
只有在filter,
或者actionmethod,或者actionresult抛出一个异常时候执行
这四种过滤器AuthorizeAttribute,ActionFilterAttribute,ResultFilterAttribute,HandleErrorAttribute都是ASP.NETMVC提供的默认过滤器。如果我们要使用这些过滤器的时候,需要继承这些类。由于这些类都是Attribute,所以我们的子类必须是以Attribute结尾的。
那么我们以ActionFilterAttribute为例来介绍一下过滤器。这个过滤器是针对Action的,那么这个Attribute必须只能作用于Action,也就是在Action执行之前,执行之后的过滤器。
在ActionFilterAttribute中,提供了四种方法来处理Action的请求过滤。
//在Action执行之后publicvirtualvoidOnActionExecuted(ActionExecutedContextfilterContext);//在Action执行之前publicvirtualvoidOnActionExecuting(ActionExecutingContextfilterContext);//解析ActionResult前执行publicvirtualvoidOnResultExecuted(ResultExecutedContextfilterContext);//解析ActionResult后执行publicvirtualvoidOnResultExecuting(ResultExecutingContextfilterContext);我们来试验一下,在我们的项目中创建一个文件夹Filter用来存放我们的过滤器。
首先,我们在Filter文件夹中创建一个过滤器“MyActionFilter.cs”,内容如下:
publicclassMyActionFilterAttribute:ActionFilterAttribute{publicoverridevoidOnActionExecuting(ActionExecutingContextfilterContext){filterContext.HttpContext.Response.Write("执行Action之前....
");}publicoverridevoidOnActionExecuted(ActionExecutedContextfilterContext){filterContext.HttpContext.Response.Write("执行Action之后....
");}publicoverridevoidOnResultExecuting(ResultExecutingContextfilterContext){filterContext.HttpContext.Response.Write("呈现View之前....
");}publicoverridevoidOnResultExecuted(ResultExecutedContextfilterContext){filterContext.HttpContext.Response.Write("呈现View之后....
");}}同时,我们需要在HomeController的Index方法之上添加这个Filter
[Filter.MyActionFilter]publicActionResultIndex(){returnView();}那么我们来运行一下。看一下结果。
发现的确正如我们所猜测的那样。但是这个例子只是给大家说名一下这个过滤器的四个方法分别是在什么之后执行的。
我们更改一下MyActionFilterAttribute的方法。
不知道本章大家有没有明白什么是过滤器呢在以后的知识介绍中,我们还会使用过滤器,这个比较重要哦!好了,本章就到此结束吧!