asp.net mvc 三種過濾器


前幾天面試遇到這個問題,發現不是很了解,學習了下,這里記錄下來

經常需要將用戶的操作記錄到日志中,或者是驗證用戶是否登錄了網站,

面對這樣的需求,以前的操作是自定義一個統一的全局方法,然后做處理,

在每個需要的頁面中添加想要的函數調用,這導致了多個頁面中存在了大

量重復的代碼,這樣的方式不太符合軟件工程的思想。為了解決這個問題,

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();
        }
    }

這里我們自定義了一個用來處理異常的類和一個日志記錄的類,

然后通過特性的方式將其添加到控制器中需要的地方,這樣的代碼就變得十分簡潔了

那我們可以使用哪些過濾器呢,這里一共有四種過濾器,解釋如下

  1. ActionFilter(方法過濾器):接口名為[IActionFilter],在控制器方法調用前/后執行
  2. ResultFilter(結果過濾器):接口名為[IResultFilter],在控制器方法調用完,跳轉至view頁面前/后執行
  3. AuthorizationFilter(授權過濾器):接口名為[IauthorizationFilter],所有過濾器中最先執行的
  4. ExceptionFilter(異常處理過濾器):接口名為[IExceptionFilter],在控制器方法拋出異常時執行

根據這里的執行順序,我們可以在不同的需求下自行實現對應的控制器,

需要注意的是,除了我們需要實現對應的過濾器接口外,同時還需要保證對應的過濾器是特性類,

這里我們可以通過繼承FilterAttribute類來實現。

接口內部方法解釋

IExceptionFilter:OnException,發生異常時調用

IResultFilter:OnResultExecuted,控制器方法執行完調用VIEW頁面后執行

       OnResultExecutint,控制器方法執行完調用VIEW頁面前執行

 

IAuthorizationFilter:OnAuthorization,最先調用

 

IActionFilter:OnActionExecuted,控制器方法執行后執行

 

       OnActionExecutint,控制器方法執行前執行

 

記錄下來,留待后查

2017 11.30 21:29

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM