MVC Filter
ASP.NET MVC Filter是典型的 AOP(面向切面编程),其中有四种过滤器:Action
,Result
,Exception
,Authorization
。
我们在编程时,可以把过滤器加在3个地方:
- 控制器上(作用于控制器下所有Action)
- Action上(当前标记的Action)
- 全局(所有控制器的Action)
Action
定义:
public class MyActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write($"Action执行前");
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write($"Action执行后");
base.OnActionExecuted(filterContext);
}
}
使用:
[MyActionFilter]
public ActionResult Index()
{
return View();
}
Result
定义:
public class MyResultFilterAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Write($"加载视图前执行);
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write($"加载视图后执行");
base.OnResultExecuted(filterContext);
}
}
使用:
[MyResultFilter]
public ActionResult Index()
{
return View();
}
Exception
定义:
public class MyExceptionAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
// 1.获取异常对象
Exception ex = filterContext.Exception;
// 2.记录异常日志
// 3.重定向友好界面
filterContext.Result = new RedirectResult("~/error.html");
// 4.标记一次已经处理完毕
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
}
通常在全局中使用,在App_Start/FilterConfig.cs:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyExceptionAttribute());
}
}
Authorization
定义:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("OnAuthorization");
base.OnAuthorization(filterContext);
}
}
通常在全局中使用,在App_Start/FilterConfig.cs:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyAuthorizeAttribute());
}
}