Action Filter

来源:互联网 发布:用友网络上市时间 编辑:程序博客网 时间:2024/06/04 18:39

Action Filter 是可以附加在Action上的标签.

ASP.NET MVC中包括了一些Filter, 如:

OutputCache:一个缓存,在指定时间间隔更新.

HandleError: 处理错误

Authorize: 授权,限制访问.

当然我们也可以创建自定义的filter.

MVC中支持以下四种Filter:

  1. Authorization filters – Implements the IAuthorizationFilter attribute.
  2. Action filters – Implements the IActionFilter attribute.
  3. Result filters – Implements the IResultFilter attribute.
  4. Exception filters – Implements the IExceptionFilter attribute.

自定义的过滤器,可以从ActionFilterAttribute继承,它继承于Filter,同时也继承了两个接口:IActionFilterIResultFilter,所以需要同时四个方法:

  • OnActionExecuting – This method is called before a controller action is executed.
  • OnActionExecuted – This method is called after a controller action is executed.
  • OnResultExecuting – This method is called before a controller action result is executed.
  • OnResultExecuted – This method is called after a controller action result is executed.

一个记录日志的Action例子:

   1: using System;
   2: using System.Diagnostics;
   3: using System.Web.Mvc;
   4: using System.Web.Routing;
   5:  
   6: namespace MvcApplication1.ActionFilters
   7: {
   8:      public class LogActionFilter : ActionFilterAttribute
   9:      {
  10:           public override void OnActionExecuting(ActionExecutingContext filterContext)
  11:           {
  12:                Log("OnActionExecuting", filterContext.RouteData);       
  13:           }
  14:  
  15:           public override void OnActionExecuted(ActionExecutedContext filterContext)
  16:           {
  17:                Log("OnActionExecuted", filterContext.RouteData);       
  18:           }
  19:  
  20:           public override void OnResultExecuting(ResultExecutingContext filterContext)
  21:           {
  22:                Log("OnResultExecuting", filterContext.RouteData);       
  23:           }
  24:  
  25:           public override void OnResultExecuted(ResultExecutedContext filterContext)
  26:           {
  27:                Log("OnResultExecuted", filterContext.RouteData);       
  28:           }
  29:  
  30:           private void Log(string methodName, RouteData routeData)
  31:           {
  32:                var controllerName = routeData.Values["controller"];
  33:                var actionName = routeData.Values["action"];
  34:                var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
  35:                Debug.WriteLine(message, "Action Filter Log");
  36:           }
  37:  
  38:      }
  39: }
原创粉丝点击