检查基类的注释模式

问题描述 投票:0回答:2

有什么方法可以从基类检查模式注释?简单说明抛出一个例子:

我有这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不是有效的方法。但是你明白了。

c# data-annotations
2个回答
1
投票

此外,在上面我的评论中,我已经在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
投票

如评论中所建议,以下内容应为您工作:

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

   System.Attribute[] attrs = System.Attribute.GetCustomAttributes(context.Controller.GetType());
}    
}
热门问题
推荐问题
最新问题