Bind a Global Action Filter to all Controllers in an Area using MVC 3 Dependency Injection with Ninject 2.2

纵饮孤独 提交于 2019-12-01 04:58:07

问题


I was able to to use ASP.NET MVC 3 and Ninject 2.2 to inject a logger object into a custom ActionFilterAttribute thanks to the help I received in this post.

Now I would like to bind my custom ActionFilterAttribute only to all controllers that are in a specific area.

I was able to get started with the following binding but it only handles one controller in a certain area. I would like my code to bind to all controllers in a specific area. Any ideas?

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

回答1:


This helped me, Thanks Darin. However, context.RouteData.Values did not have the area for me but context.RouteData.DataTokens["area"] did! also in my case I had controller that were not in specific areas (e.g. shared controllers) therefore I had to check for datatoken area to be null. This is what worked for me:

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



回答2:


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

or:

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


来源:https://stackoverflow.com/questions/5479066/bind-a-global-action-filter-to-all-controllers-in-an-area-using-mvc-3-dependency

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!