从基础 class 检查注释模式
Check annotation schema from base class
有什么方法可以从基础 class 检查模式注释吗?
抛个例子简单说明:
我有这 2 个控制器
[Authorize]
public class HomeController : _baseController
{
//Some actions here
}
[AllowAnonymous]
public class OtherController : _baseController
{
//Some actions here
}
然后我有这个基础 class 覆盖 OnActionExecuting
。 objective 是在控制器有注释的情况下执行一些操作。
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
不是一个有效的方法。但是你明白了。
根据评论中的建议,以下内容应该适合您:
public class _baseController
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(context.Controller.GetType());
}
}
根据我上面的评论,我在 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
扩展。
请注意,此解决方案适用于放置在控制器 class 本身上的属性(如问题中所问),但不适用于放置在操作方法上的属性。为了使其适用于操作方法,以下工作:
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
}
}
有什么方法可以从基础 class 检查模式注释吗? 抛个例子简单说明:
我有这 2 个控制器
[Authorize]
public class HomeController : _baseController
{
//Some actions here
}
[AllowAnonymous]
public class OtherController : _baseController
{
//Some actions here
}
然后我有这个基础 class 覆盖 OnActionExecuting
。 objective 是在控制器有注释的情况下执行一些操作。
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
不是一个有效的方法。但是你明白了。
根据评论中的建议,以下内容应该适合您:
public class _baseController
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context);
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(context.Controller.GetType());
}
}
根据我上面的评论,我在 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
扩展。
请注意,此解决方案适用于放置在控制器 class 本身上的属性(如问题中所问),但不适用于放置在操作方法上的属性。为了使其适用于操作方法,以下工作:
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
}
}