前幾天面試遇到這個問題,發現不是很了解,學習了下,這里記錄下來
經常需要將用戶的操作記錄到日志中,或者是驗證用戶是否登錄了網站,
面對這樣的需求,以前的操作是自定義一個統一的全局方法,然后做處理,
在每個需要的頁面中添加想要的函數調用,這導致了多個頁面中存在了大
量重復的代碼,這樣的方式不太符合軟件工程的思想。為了解決這個問題,
mvc為我們提供了過濾器來完成對應的功能,通過過濾器,我們只需要將
相應的業務處理代碼寫一次,再在相應的功能處通過特性的方式來使用寫
好的過濾器。
一句話,我們可以用過濾器來分離與業務邏輯無關卻經常需要執行的代碼,
既保證業務邏輯的正確性,也保證了代碼的簡潔直觀
先看一段示例:
public class Log : FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { Console.WriteLine("log-after"); //throw new NotImplementedException(); } public void OnActionExecuting(ActionExecutingContext filterContext) { Console.WriteLine("log-before"); //throw new NotImplementedException(); } } public class Exc : FilterAttribute, IExceptionFilter { public void OnException(ExceptionContext filterContext) { Console.WriteLine("err"); filterContext.ExceptionHandled = true; //throw new NotImplementedException(); } } public class HomeController : Controller { // GET: Home [Log] [Exc] public ActionResult Index() { throw new Exception("error"); //return View(); } }
這里我們自定義了一個用來處理異常的類和一個日志記錄的類,
然后通過特性的方式將其添加到控制器中需要的地方,這樣的代碼就變得十分簡潔了
那我們可以使用哪些過濾器呢,這里一共有四種過濾器,解釋如下
- ActionFilter(方法過濾器):接口名為[IActionFilter],在控制器方法調用前/后執行
- ResultFilter(結果過濾器):接口名為[IResultFilter],在控制器方法調用完,跳轉至view頁面前/后執行
- AuthorizationFilter(授權過濾器):接口名為[IauthorizationFilter],所有過濾器中最先執行的
- ExceptionFilter(異常處理過濾器):接口名為[IExceptionFilter],在控制器方法拋出異常時執行
根據這里的執行順序,我們可以在不同的需求下自行實現對應的控制器,
需要注意的是,除了我們需要實現對應的過濾器接口外,同時還需要保證對應的過濾器是特性類,
這里我們可以通過繼承FilterAttribute類來實現。
接口內部方法解釋
IExceptionFilter:OnException,發生異常時調用
IResultFilter:OnResultExecuted,控制器方法執行完調用VIEW頁面后執行
OnResultExecutint,控制器方法執行完調用VIEW頁面前執行
IAuthorizationFilter:OnAuthorization,最先調用
IActionFilter:OnActionExecuted,控制器方法執行后執行
OnActionExecutint,控制器方法執行前執行
記錄下來,留待后查
2017 11.30 21:29
