我有一个名为GetRole()的静态方法,它返回一个字符串值.
现在我想在使用属性参数时调用它.
例如:
现在我想在使用属性参数时调用它.
例如:
[Authorize(Roles = GetRole())] public ActionResult Get() { } public static string GetRole() { return "Admin"; }
但编译器得到以下错误:
An attribute argument must be a constant expression,typeof expression or array creation expression of an attribute parameter type
解决方法
编译器错误非常清楚,在声明属性时不能调用任何方法(因为它的值必须在编译时知道),但是您可以派生自己的自定义属性,派生自AuthorizeAttribute以执行所需的所有逻辑.不是我们所做的就是本地化NameAttribute&朋友在花哨的长期等待本地化感知数据注释之前?
概念证明:
class DynamicAuthorizeAttribute : AuthorizeAttribute { protected bool AuthorizeCore(HttpContextBase context) { // Perform your logic here,eventually update Roles property } }
然后:
[DynamicAuthorize] public ActionResult Get() { // ... }
这只是一种可能的方式,在那里你可以放置自己的逻辑或简单地更新Roles属性并委托给通常的逻辑简单地调用base.AuthorizeCore(context).请注意,此处的所有代码必须是线程安全的.
如果您正在使用静态方法并且想要将该逻辑保留在控制器中,那么您可以使用它来接受(例如)类似这样的事情:
[DynamicAuthorize(typeof(MyView),nameof(GetRole))]
请注意,您可以从context.HttpContext.Request.RequestContext.RouteData访问控制器和视图名称.