Как узнать, есть ли у контроллера атрибут в ASP.net?

В представлении, например, в "_Layout.cshtml"

Как получить контроллер / действие, вызвавшее это представление?

После того, как вы нашли имя контроллера / действия, как получить список атрибутов, которые у него есть? Или проверить, есть ли у него атрибут?

Спасибо.


person Eric Yin    schedule 04.12.2011    source источник
comment
Ответ на первую часть вашего вопроса: stackoverflow.com/questions/1083774/   -  person David Spence    schedule 04.12.2011
comment
Вам нужны атрибуты action \ controller? см. этот ответ атрибутов действия: stackoverflow.com/a/8369591/601179   -  person gdoron is supporting Monica    schedule 04.12.2011


Ответы (2)


@ViewContext.Controller предоставит вам экземпляр контроллера, который вернул это представление. Как только вы получаете экземпляр, вы получаете тип, а когда у вас есть тип, вы попадаете в Reflection, чтобы получить атрибуты, которыми украшен этот тип. Написание специального HTML-помощника для выполнения этой работы может того стоить:

public static class HtmlExtensions
{
    public static bool IsDecoratedWithFoo(this HtmlHelper htmlHelper)
    {
        var controller = htmlHelper.ViewContext.Controller;
        return controller
            .GetType()
            .GetCustomAttributes(typeof(FooAttribute), true)
            .Any();
    }
}
person Darin Dimitrov    schedule 04.12.2011
comment
1. Вы не проверяете атрибуты действия, только контроллер. 2. Лучше использовать метод IsDefined: msdn. microsoft.com/en-us/library/ - person gdoron is supporting Monica; 04.12.2011
comment
1. Вот о чем он спросил. 2. Вы правы, IsDefined лучше. - person Darin Dimitrov; 04.12.2011
comment
Ну, он упомянул об этом в теле вопроса, хотя в заголовке он просил контроллер. - person gdoron is supporting Monica; 04.12.2011

Поскольку это первый результат в Google даже при поиске версии ASP.NET Core, вот как это сделать в .NET Core: Проверка атрибута в фильтре действий (пожалуйста, проголосуйте за исходную ветку)

        if (controllerActionDescriptor != null)
    {
        // Check if the attribute exists on the action method
        if (controllerActionDescriptor.MethodInfo?.GetCustomAttributes(inherit: true)?.Any(a => a.GetType().Equals(typeof(CustomAttribute))) ?? false)
            return true;

        // Check if the attribute exists on the controller
        if (controllerActionDescriptor.ControllerTypeInfo?.GetCustomAttributes(typeof(CustomAttribute), true)?.Any() ?? false)
            return true;
    }
person kurdemol94    schedule 13.03.2020