在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下載
新聞熱點
疑難解答