在MVC项目当中,当我们要实现这些功能时:身份验证,异常处理、日志记录,性能统计,如果按照一般的做法那就需要在每个页面重复做这些工作,这样做起来不仅费时费力,代码也会变得冗余难懂,如何在不改变原有代码结构添加这些功能呢?AOP就是为了解决这一类问题而产生的。AOP,意为:面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。在MVC中,过滤器就是一种AOP技术。
MVC支持的过滤器类型有四种,分别是:Authorization(授权),Action(行为),Result(结果)和Exception(异常),如下表
1、过滤器定义
public class MyFilter : FilterAttribute, IActionFilter, IResultFilter, IAuthorizationFilter, IExceptionFilter { public void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write("返回授权<br/>"); } public void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Action执行之前<br/>"); } public void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("Action执行之后<br/>"); } public void OnException(ExceptionContext filterContext) { filterContext.HttpContext.Response.Write("返回异常:" + filterContext.Exception); filterContext.ExceptionHandled = true; //标记异常已处理 } public void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("Request执行之前<br/>"); } public void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("Request执行之后<br/>"); } }
从上面的代码看出要实现这四种过滤器都要实现各自的接口,其中FilterAttribute则是为了把过滤器变成特性类。
四种过滤的执行顺序是,Authorization(授权过滤器)的OnAuthorization()方法最先执行,接着是Action(行为过滤器)的方法OnActionExecuting()和OnActionExecuted()。如果Action时抛出异常,则执行Exception(异常过滤器)的方法OnException(),Result(结果过滤器)的方法OnResultExecuting()和OnResultExecuted()则不会再执行。如果没有异常,则执行Result(结果过滤器)的两个方法。
2、过滤器使用
[MyFilter] public class HomeController : Controller { [MyFilter] public ActionResult Index() { throw new Exception("我是异常"); return View(); } }
说明:可以直接加在Controller或Action上,如果同时加,则只会执行Action上的过滤器。
如果需要所有的Controller加过滤器,可以在FilterConfig中实现,如下:
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new MyFilter); } }
如果要自定义Action(行为过滤器)和Result(结果过滤器),我们可以通过继承类ActionFilterAttribute,重写类中的方法来实现,具体如下:
public class MyFilter : 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) { base.OnResultExecuted(filterContext); filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />"); } }
Authorization(授权过滤器)对应的类是:AuthorizeAttribute
Exception(异常过滤器)对应的类是:HandleErrorAttribute
Demo下载
新闻热点
疑难解答