4

我能夠使用ASP.NET MVC 3和Ninject 2.2將記錄器對象注入到自定義ActionFilterAttribute感謝幫助我收到了這個post將全局動作過濾器綁定到區域中的所有控制器使用MVC 3依賴注入與Ninject 2.2

現在我想將我的自定義ActionFilterAttribute僅綁定到特定區域中的所有控制器。

我能夠開始使用以下綁定,但它只處理某個區域中的一個控制器。我希望我的代碼綁定到特定區域的所有控制器。有任何想法嗎?

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ILogger>().To<Log4NetLogger>().InRequestScope(); 
    kernel.BindFilter<TestLoggingAttribute>(
     FilterScope.Controller, 0) 
      .WhenControllerType<OrganizationController>(); 
} 

回答

6

這幫助我,謝謝達林。然而,context.RouteData.Values沒有我的區域,但context.RouteData.DataTokens [「區域」]做到了!在我的情況下,我有控制器不在特定區域(例如共享控制器),因此我必須檢查datatoken區域爲空。這對我來說很有用:

kernel 
    .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0) 
    .When((context, ad) => context.RouteData.DataTokens["area"] != null && context.RouteData.DataTokens["area"] == "Organization"); 
5
kernel 
    .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0) 
    .When((context, ad) => context.RouteData.Values["area"] == "YourAreaName"); 

或:

kernel 
    .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0) 
    .When((context, ad) => context.Controller.GetType().FullName.Contains("Areas.YourAreaName"));