Проверьте схему аннотации из базового класса - PullRequest
0 голосов
/ 25 октября 2019

Есть ли способ проверить аннотацию схемы из базового класса? Это просто объяснить, например:

У меня есть 2 контроллера

[Authorize]
public class HomeController : _baseController
{
   //Some actions here    
}

[AllowAnonymous]
public class OtherController : _baseController
{
   //Some actions here    
}

Тогда у меня есть базовый класс, который переопределяет OnActionExecuting. Цель состоит в том, чтобы выполнить какое-либо действие, если у контроллера есть аннотация.

public class _baseController
{
   public override void OnActionExecuting(ActionExecutingContext context)
    {
        base.OnActionExecuting(context);

        if(context.Controller.hasAnnotation("Authorize")){
              //do something
        }
        else if(context.Controller.hasAnnotation("AllowAnonymous")){
              //do something
        }
    }    
}

Очевидно, context.Controller.hasAnnotation не является допустимым методом. Но вы поняли.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

В дополнение к моему комментарию выше, я протестировал следующее решение в ASP.Net Core 3.

public override void OnActionExecuting(ActionExecutingContext context)
{
  var allowAnonAttr = Attribute.GetCustomAttribute(context.Controller.GetType(), typeof(AllowAnonymousAttribute));

  if(allowAnonAttr != null)
  {
    // do something
  }
}

В более старых версиях ASP.NET вы также должны ссылаться на System.Reflection, чтобы использоватьрасширения GetCustomAttribute.

Обратите внимание, что это решение работает для атрибутов, помещенных в сам класс контроллера (как задано в вопросе), но не будет работать для атрибутов, размещенных в методах действия. Чтобы заставить его работать для методов действия, ниже работает:

public override void OnActionExecuting(ActionExecutingContext context)
{
  var descriptor = context.ActionDescriptor as ControllerActionDescriptor;
  var actionName = descriptor.ActionName;
  var actionType = context.Controller.GetType().GetMethod(actionName);

  var allowAnonAttr = Attribute.GetCustomAttribute(actionType, typeof(AllowAnonymousAttribute));

  if(allowAnonAttr != null)
  {
    // do something
  }
}
0 голосов
/ 25 октября 2019

Как предлагается в комментариях, ниже должно работать для вас:

public class _baseController
{
public override void OnActionExecuting(ActionExecutingContext context)
{
    base.OnActionExecuting(context);

   System.Attribute[] attrs = System.Attribute.GetCustomAttributes(context.Controller.GetType());
}    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...