我有这两行:
[AccessDeniedAuthorize(new string[] { "MIS", "Test" })]
[AccessDeniedAuthorize(DAL.RoleHandler.GetRolesForTcode("testMenu"))]
但是第二行有这个错误:
属性参数必须是属性参数类型
的常量表达式,typeof表达式或数组创建表达式
但是GetRolesForTcode
也会返回string[]
,为什么会出错?
public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary { { "Controller", "AccessDenied" }, { "Action", "Index" } });
}
}
public AccessDeniedAuthorizeAttribute(string[] roles)
{
this.Roles = string.Join(",", roles);
}
}
public class RoleHandler
{
public static string[] GetRolesForTcode(string tCode)
{
using (var db = new Models.VMIEntities())
{
var roles = db.T_Auth_Role_Master
.Where(role => string.Compare(role.obj, "t_code", StringComparison.OrdinalIgnoreCase) == 0)
.Where(role => string.Compare(role.authobj_value, tCode, StringComparison.OrdinalIgnoreCase) == 0)
.Select(role => role.role);
return roles.ToArray();
}
}
}
答案 0 :(得分:2)
如你所说,
属性参数必须是属性参数类型
的常量表达式,typeof表达式或数组创建表达式
DAL.RoleHandler.GetRolesForTcode("testMenu")
不是那些东西。它不是常量表达式,因为它无法在编译时进行求值。方法在运行时进行评估。
根据C#语言规范第17.2节,
如果以下所有语句都为真,则表达式E是attribute-argument-expression:
- E的类型是属性参数类型(第17.1.3节)。
- 在 编译 -time,E的值可以解析为以下之一:
- 一个恒定值。
- 一个
System.Type
对象。- attribute-argument-expressions 的一维数组。
这就是错误发生的原因。你必须在那里放一个常量表达式。