Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Eric YinОтветов: 2

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

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

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

Спасибо.

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

controllerviewattributesaction

Ответы

Ответ 1 · рейтинг 8 · Darin Dimitrov

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

Ответ 2 · kurdemol94

Поскольку это первый результат в 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;
    }

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы