Ahm*_*deh 7 c# asp.net methods attributes
我有一个名称的静态方法GetRole()返回一个字符串值.
现在我想在使用属性参数时调用它.
例如:
[Authorize(Roles = GetRole())]
public ActionResult Get()
{
}
public static string GetRole()
{
return "Admin";
}
Run Code Online (Sandbox Code Playgroud)
但编译器得到以下错误:
属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式
请帮我调用属性中的方法.
编译器错误非常清楚,在声明属性时不能调用任何方法(因为它的值必须在编译时知道),但是您可以派生自己的自定义属性,派生自AuthorizeAttribute执行所需的所有逻辑.NameAttribute在花哨的长期等待本地化感知数据注释之前,我们所做的不是本地化和朋友们所做的事情吗?
概念证明:
class DynamicAuthorizeAttribute : AuthorizeAttribute {
protected bool AuthorizeCore(HttpContextBase context) {
// Perform your logic here, eventually update Roles property
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
[DynamicAuthorize]
public ActionResult Get() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
这只是一种可能的方式,你可以把你自己的逻辑或只是更新Roles属性和委托给通常的逻辑简单地调用base.AuthorizeCore(context).请注意,此处的所有代码必须是线程安全的.
如果您正在使用静态方法并且想要将该逻辑保留在控制器中,那么您可以使用它来接受(例如)类似这样的事情:
[DynamicAuthorize(typeof(MyView), nameof(GetRole))]
Run Code Online (Sandbox Code Playgroud)
请注意,您可以从中访问控制器和视图名称context.HttpContext.Request.RequestContext.RouteData.
然后调用这样的静态方法.请注意,如果逻辑非常复杂且变化很大,那么您可能希望集中此逻辑并使用其他MVC 工具来执行此操作.