В представлении, например, в "_Layout.cshtml"
Как получить контроллер / действие, вызвавшее это представление?
После того, как вы нашли имя контроллера / действия, как получить список атрибутов, которые у него есть? Или проверить, есть ли у него атрибут?
Спасибо.
Ответ 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;
}