首页 > 代码库 > [转]MVC Action Filter

[转]MVC Action Filter

ASP.NET MVC Framework支持四种不同类型的Filter:

  1. Authorization filters – 实现IAuthorizationFilter接口的属性.
  2. Action filters – 实现IActionFilter接口的属性.
  3. Result filters – 实现IResultFilter接口的属性.
  4. Exception filters – 实现IExceptionFilter接口的属性.

Filter的默认的执行顺序按上面的列表中顺序进行。如验证(authorization)Filter永远都是最开始执行的,异常(exception)Filter永远都是最后执行的,当然你也可以根据需要通过Order属性设定过滤器执行的顺序。

 

ASP.NET MVC Framework包括几种Action Filter:

 

名称说明
OutputCacheAttribute 类似于 Web Form中在 OutputCache 指令。 OutputCache 属性允许在 MVC Framework 缓存控制器的输出。
ValidateInputAttribute 

类似于 Web Form中 ValidateRequest 属性。 MVC 框架默认将为 检查HTML 或其他危险输入传入的 HTTP 请求。 如果检测到,将引发异常。 使用此属性可以禁用请求验证。

AuthorizeAttributeAuthorize 属性,可以对控制器操做的声明性的授权检查。 该属性可以限制特定角色中的用户的操作。 当您创建只应该给管理员角色中的用户的操作时,您可以使用此属性。默认使用的ASP.NET Membership服务,如果不使用ASP.NET 的Membership服务,可以继承AuthorizeAttribute,重写实现。
ValidateAntiForgeryTokenAttribute此属性是一个解决方案以帮助防止跨站点的请求攻击 (CSRF)。 它允许验证的 HTTP POST 为特定于用户的标记在 Framework。 有关详细信息 CSRFs,请参阅" 使用 ASP.NET MVC AntiForgeryToken() 帮助器防止跨站点请求伪造 (CSFR)."

 

 

 

 

 

 

 

 

 

 

 

验证(authorization)filter用于实现在controller action上的验证和授权,如Authorize filter就是一个验证filter的例子;

Action filter包含一些逻辑,用于该action执行之前或者之后。比如可以使用一个action filter来修改action返回的view data;

Result filter包含一些逻辑,用于该action的view result执行之前和之后。比如可以修改一个view result在view被呈现到浏览器之前;

异常(Exception)Action用于处理异常信息,同样可以使用异常filter记录错误日志。

这些的filter类型是根据指定的顺序执行的,如果需要控制他们的执行顺序,需要设置filter的Order属性。

这些类的基类为System.Web.Mvc.FilterAttribute类,如果需要实现一个特定的filter类型,可以创建一个继承这个类的类,并且实现一个或多个IAuthorization、IActionFilter、IResultFilter、ExceptionFilter接口。

 

Action过滤器的作用范围

除了用Action过滤器标记一个Action方法外,你也可以用来标记一个完成的控制器类。如果这样的话,这个Action过滤器将会应用到该控制器的所有Action方法上。

另外,如果你的控制器类继承自别的控制器类,而基控制器类可能有它自己的Action过滤器Attributes。如果你在子类中重写了基控制器类的Action方法,则子类的该Action方法也会有它自己的从基类继承而来的Action过滤器Attributes。

 

Action过滤器的执行顺序

每一个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.

 

内置过滤器简介

1OutputCacheAttribute

 

[OutputCache(Duration=10,VaryByParam="none")]        public ActionResult TestCache() {            ViewBag.Time = DateTime.Now.ToString();            return View();        }

 

上述代码在动作方法上设置了OutputCache特性,使得页面具有缓存功能,缓存10秒。Cache的属性也可在web.config中设置

<caching>          <outputCacheSettings>              <outputCacheProfiles>                  <add name="outPutCache" duration="10" varyByParam="none"/>              </outputCacheProfiles>          </outputCacheSettings>      </caching>

相应的动作方法上

[OutputCache(CacheProfile="outPutCache")]        public ActionResult TestCache() {            ViewBag.Time = DateTime.Now.ToString();            return View();        }

2 AuthorizeAttribute

该类主要实现页面的成员和角色管理,AuthorizeAttribute类中设置了两个属性,分别是Users和Roles,分别表示成员和角色

[Authorize]        public ActionResult TestAuthorize()        {             return View();        }

上述动作方法上设置了Authorize特性,指明该动作方法只能是注册并通过认证的用户才能访问

[Authorize(Users="test1,test2")]        public ActionResult TestAuthorize()        {             return View();        }

上述动作方法指明只有用户test1,test2能够访问,如果用户过多,可以将这些用户设置为一类角色,通过设置角色参数来设定

  [Authorize(Roles="Admin")]        public ActionResult TestAuthorize()        {             return View();        }

上述动作方法指明只有角色为Admin的用户才能访问。

3 HandleErrorAttribute

该类实现网站中指定控制器或者控制器中相关方法的异常处理。在动作方法上设置了[HandleError]特性后,发生异常时将自动交给异常处理页面,在MVC 4中,创建项目时,已经在Global.asax中添加了全局的HandleError特性

public static void RegisterGlobalFilters(GlobalFilterCollection filters)        {            filters.Add(new HandleErrorAttribute());        }

 

ActionFilterAttribute基类

为了让用户更简单的创建一个自定义action filter,ASP.NET MVC Framework提供了一个基类ActionFilterAttribute,这个类实现了IActionFilter和IResultFilter接口,并且继承了Filter类。

这里的术语并不完全一致,从技术上说,这个类继承ActionFitlerAttribute,并且同时实现了action filter和result filter接口,但是从宽松意义上说,在ASP.NET MVC Framework中,任何实现filter的类型都是action filter。

ActionFilterAttribute类有以下的方法可以重写:

  • OnActionExecuting – 在controller action执行之前调用
  • OnActionExecuted – 在controller action执行之后调用
  • OnResultExecuting – 在controller action result执行之前调用
  • OnResultExecuted – 在controller action result执行之后调用

以下是这几个方法的执行顺序:

OnActionExecuting()-> Action execute & return View() ->OnActionExecuted() ->OnResultExecuting() -> Render View() ->OnResultExecuted()

为了阐述如何创建一个自定义的action filter,我们会创建一个自定义的action filter,用于记录controller action处理的不同阶段的日志信息,并显示到Visual Studio输出窗口中。

 

 public class LoginActionFilter : ActionFilterAttribute    {        public override void OnActionExecuted(ActionExecutedContext filterContext)        {            Log("OnActionExecuted",filterContext.RouteData);            base.OnActionExecuted(filterContext);        }        public override void OnActionExecuting(ActionExecutingContext filterContext)        {            Log("OnActionExecuting", filterContext.RouteData);            base.OnActionExecuting(filterContext);        }        public override void OnResultExecuted(ResultExecutedContext filterContext)        {            Log("OnResultExecuted", filterContext.RouteData);            base.OnResultExecuted(filterContext);        }        public override void OnResultExecuting(ResultExecutingContext filterContext)        {            Log("OnResultExecuting", filterContext.RouteData);            base.OnResultExecuting(filterContext);        }        private void Log(string methodName, RouteData routeData) {            var controllerName = routeData.Values["controller"];            var actionName = routeData.Values["action"];            var message = String.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);            Debug.WriteLine(message,"Action Filter Log");        }    }

 

输出结果:

Action Filter Log: OnActionExecuting controller: Home action: IndexAction Filter Log: OnActionExecuted controller: Home action: IndexAction Filter Log: OnResultExecuting controller: Home action: IndexAction Filter Log: OnResultExecuted controller: Home action: Index

[转]MVC Action Filter