2010-07-16 59 views
2

我所有的控制器從具有一個ActionFilter屬性BaseController繼承AnalyticsData ActionFilter僅運行一次。這是一件好事,我只希望它運行一次,但我想知道這是如何發生的。如果我把我的OnActionExecuting內斷點:ASP.NET ActionFilters和繼承

public class AnalyticsAttribute : ActionFilterAttribute 
{ 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // break point set here 
     } 
} 

...它只被當的AccountController提供其個人資料視圖打一次。

ActionFilters和/或Attributes如何工作,Action上的[AnalyticsData(頁面=「AccountProfile」)]覆蓋/替換BaseController上的[AnalyticsData]?

回答

3

簡短的回答是,檢索每個動作的過濾器列表的ASP.NET MVC框架代碼以這樣的方式刪除重複項(相同類型的動作過濾器),使得它偏好在動作方法上定義的動作過濾器定義在控制器(或其基類)上。在MVC 2中,此邏輯在ActionDescriptor類中的幾個內部方法中執行