mvc 篩選器

 

以前公司中,運用ActionFilterAttribute特性實現用戶登陸信息的驗證,沒事看了看,留下點東西備忘。html

好的,瞅這玩意一眼就大概能猜到這貨是幹嗎的了吧,沒錯,action過濾器。其實就是AOP的思想,將咱們的邏輯或業務進行了分片,使咱們更加專一於業務的實現。不太清楚的娃子能夠度娘下。(其實我也不是很瞭解,有空再把AOP深刻了解下)web

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFiltermvc

 

首先從名稱咱們就知道,這是一個特性,這個特性能夠用於類,用於方法,可被繼承,可否加多個實例(AllowMultiple = false 獲取或設置一個布爾值,該值指示可否爲一個程序元素指定多個指示屬性實例)框架

他繼承了FilterAttribute,IActionFilter,IResultFilteride

      那好,爲了詳細瞭解這個特性是幹嗎呢,咱們一個個看起spa

1,這尼瑪一個個用語言描述定義太麻煩,借用園子中一童鞋的圖(原文:http://www.cnblogs.com/darkdawn/archive/2008/07/20/1247022.htmlhtm

 

這一眼就清晰多了,不過這個圖也不夠全面,不過也不是很重要(感興趣的童鞋能夠查一下大概的層次結構),FilterAttribute(表示操做和結果篩選器特性的基類。)其實還繼承了IMvcFilter,接口。(定義用於指定篩選器順序以及是否容許多個篩選器的成員。)blog

哦,大概瞭解了點,IMvcFilter定義了篩選器的基本功能,執行順序,是否能多篩選,繼承

FilterAttribute 是各種篩選器的基類接口

ActionFilterAttribute 這是實現action的篩選的抽象類

AuthorizeAttribute 這是實現用戶身份驗證的特性類

HandleErrorAttribute 這是處理異常的特性類

(public class AuthorizeAttribute : FilterAttribut, IAuthorizationFilter)

(public class HandleErrorAttribute : FilterAttribute,IExceptionFilter)

 

嗯,到如今,瞭解了一些了。

繼續看ActionFilterAttribute ,還有兩個接口IActionFilter,IResultFilter。

看名稱大體就能猜到一個是action過濾器的接口,一個是結果過濾的接口

看了一下,其實就是定義了開始先後執行的兩個方法

 

OnActionExecuted

在執行操做方法後由 MVC 框架調用。

 

OnActionExecuting

在執行操做方法以前由 MVC 框架調用。

 

OnResultExecuted

在執行操做結果後由 MVC 框架調用。

 

OnResultExecuting

在執行操做結果以前由 MVC 框架調用。

 

Ok,如今基本就清楚了,大體思路就是,好比商城中,訂單頁面須要用戶登陸,那麼其實對應到咱們的處理就是,在訂單頁面開始以前,驗證用戶是否登陸,其實就是在頁面的action執行以前進行驗證。那咱們就能夠本身寫一個UserLoginAttribute,繼承ActionFilterAttribute,實現OnActionExecuting這個方法,在其中驗證。而後咱們須要用戶登陸的action加上所需標籤便可(controller或者全局的都行)。

 

如今咱們要重構代碼,統一處理異常信息。查一下,哦,有這麼個玩意HandleErrorAttribute ,大體東西跟其餘過濾器是同樣的,只不過這個類不是抽象類罷了

並且用的時候須要改下配置文件

(http://msdn.microsoft.com/zh-cn/library/system.web.mvc.handleerrorattribute(v=vs.118).aspx)

這裏有篇異常處理的例子,很簡單,童鞋麼能夠看一下(http://www.cnblogs.com/pengzhen/p/3774814.html)。

 

Mvc內置了四種篩選器(AuthorizationFilter、ActionFilter、ResultFilter和ExceptionFilter),它們對應着相應的篩選器接口(IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter)

 

這裏關於篩選器的實現Filter,FilterProvider以及各篩選器的執行順序,Artech有篇深刻講解的文章,(http://www.cnblogs.com/artech/archive/2012/07/02/filter.html

對着源碼看一遍,仍是很能提升對篩選器的實現的理解的。尼瑪基本看的差很少了,試試吧。

相關文章
相關標籤/搜索