Привязать фильтр глобального действия ко всем контроллерам в области, используя MVC 3 Inpendency Injection с Ninject 2.2 - PullRequest
4 голосов
/ 30 марта 2011

Мне удалось использовать ASP.NET MVC 3 и Ninject 2.2 для добавления объекта регистратора в пользовательский атрибут ActionFilterAttribute благодаря помощи, которую я получил в этой публикации .

Теперь я хотел бы привязать свой собственный атрибут 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>();
}

Ответы [ 2 ]

6 голосов
/ 30 марта 2011

Это помогло мне, спасибо, Дарин.Однако у context.RouteData.Values ​​не было области для меня, а у context.RouteData.DataTokens ["area"] это было!также в моем случае у меня был контроллер, который не был в определенных областях (например, общие контроллеры), поэтому я должен был проверить, чтобы область datatoken была нулевой.Вот что у меня сработало:

kernel
   .BindFilter<TestLoggingAttribute>(FilterScope.Controller, 0)
   .When((context, ad) => context.RouteData.DataTokens["area"] != null && context.RouteData.DataTokens["area"] == "Organization");
5 голосов
/ 30 марта 2011
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"));
...