当前位置 > 首页 > Asp.net

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功能

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

第一节:知识储备

Asp.Net MVC提供了以下几种默认的Filter

Filter Type

实现接口

执行时间

Default Implementation

Authorization filter

IAuthorizationFilter

在所有FilterAction执行之前执行

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 class TestFilterAttribute: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)
{