ASP.NET MVC中使用攔截器

本文 ASP.NET MVC中使用攔截器摘要: ASP.NET MVC框架內置了攔截Action的機制。確切的分爲:Action攔截器Result攔截器Exception攔截器三種。所謂 ASP.NET MVC攔截器,就是一個普通的類,該類須要繼承FilterAttribute基類,Action攔截器還要實現IActionFilter接口,而Exception攔截器須要實現IExceptionFilter接口。html

        Action執行過濾的接口爲:IActionFilter它有兩個方法,OnActionExecuted:做用是Action執行後過濾;OnActionExecutingAction執行前過濾。而FilterAttribute表示用在屬性上的成員篩選器。app

 
    1、日誌攔截器
這個類繼承了FilterAttribute並實現了接口的IActionFilter的兩個方法:OnActionExecuting在被攔截Action前執行了準備寫入日誌操做,OnActionExecuted在被攔截Action後執行操做完成日誌。兩個方法都有一個參數,雖然類型不一樣,但其實都是一個做用:被攔截Action的上下文。
 
    2、異常攔截器
 
異常攔截器同樣須要繼承FilterAttribute,可是不要實現IActionFilter,而是要實現IExceptionFilter接口,這個接口只有一個方法:OnException,顧名思義,固然是發生異常時被調用了。咱們看看我讓它作了什麼:首先將異常信息(ExceptionContext同樣也是上下文,而其成員的Exception就是一個Exception類型的實例,就是被拋出的異常)記錄到ViewData相應的鍵值裏,而後咱們要呈現Error這個視圖。
注意!這裏已經不是Controller裏了,而是另外一個類,因此固然不能調用View方法返回ViewResult實例了。咱們只好新建一個ViewResult實例,並將其視圖名設爲Error,將上下文中的DataView傳過去。
最後那行filterContext.ExcepitonHandled = true;很重要,這行的意思是告訴系統,異常已經處理,不要再次處理了。
使用攔截器當然很爽,可是要注意兩個地方:
1.Action攔截器的做用範圍
除了用Action攔截器標記一個Action方法外,你也能夠用來標記一個完成的控制器類。若是這樣的話,這個Action攔截器將會應用到該控制器的全部Action方法上。
另外,若是你的控制器類繼承自別的控制器類,而基控制器類可能有它本身的Action攔截器Attributes。若是你在子類中重寫了基控制器類的Action方法,則子類的該Action方法也會有它本身的從基類繼承而來的Action攔截器Attributes。
2.Action攔截器的執行順序
每個Action攔截器都有一個 Order 屬性,用來決定Action攔截器在該範圍內的執行順序。Order屬性必需是0(默認值)或者更大的整數值。省略Order屬性則會給該攔截器的Order值爲 -1, 代表爲指明順序。任何一個在同一範圍的Action攔截器Order設爲 -1 的都將按不肯定的順序執行,單在此以前攔截器有一個特定的順序(注:下面會說到).
當設置Order屬性的值的時候,必需指定一個惟一的值。若是兩個或者更多的Action攔截器具備相同的Order屬性值,將會拋出一個異常。
來看一個示例:
[Filter1(Order 2)]
[Filter2(Order
 3
)]
[Filter3(Order
 1)]
public void 
Index()
{
    RenderView(
"Index"
);
}
Filter的執行順序爲:Filter3 => Filter1 => Filter2.
 
綜上所述,使用攔截器顯而易見的優勢:
1. 解決了部分代碼重複的問題。不少日誌處理代碼和異常處理代碼是很類似的,這樣就致使了各個Action中存在大量重複代碼。
2. 職責的明確化。 Controller僅僅是控制器,只負責表示邏輯,而不該該被一大堆日誌處理代碼和try...catch塊包圍。咱們要的Action,應該是乾淨的、工整的、僅包含表示邏輯的Action。
3. 代碼更加優雅。
 
 固然了,也有他的缺點,在 ASP.NET MVCController中一個Action最好不要超過2,3個帽子(攔截器或過濾器),不然性能會受到影響。
 
關於更多的 業務組件的內容,你們能夠訪問 http://www.po-soft.com/
相關文章
相關標籤/搜索