Action Filter 是可以附加在Action上的标签.
ASP.NET MVC中包括了一些Filter, 如:
OutputCache:一个缓存,在指定时间间隔更新.
HandleError: 处理错误
Authorize: 授权,限制访问.
当然我们也可以创建自定义的filter.
MVC中支持以下四种Filter:
- Authorization filters – Implements the
IAuthorizationFilter
attribute. - Action filters – Implements the
IActionFilter
attribute. - Result filters – Implements the
IResultFilter
attribute. - Exception filters – Implements the
IExceptionFilter
attribute.
自定义的过滤器,可以从ActionFilterAttribute继承,它继承于Filter,同时也继承了两个接口:
IActionFilter
及 IResultFilter,所以需要同时四个方法:
- 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: }