ASP.NET MVC - 属性参数必须是常量表达式
ASP.NET MVC - An attribute argument must be a constant expression
我正在尝试创建一个自定义属性来验证我的 MVC 5 应用程序的每个操作方法中的会话状态。
这是自定义属性的代码。
[AttributeUsage(AttributeTargets.Method)]
public class CheckSession : ActionFilterAttribute
{
public string SessionKey { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionParameters.ContainsKey(SessionKey))
{
string value = filterContext.ActionParameters[SessionKey] as string;
if ((string)filterContext.HttpContext.Session[value] == null)
{
var control = filterContext.Controller as Controller;
if (control != null)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary
{
{"controller", "Home"},
{"action", "Error"},
{"area", ""}
}
);
}
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
}
我正在使用的会话密钥常量:
public static class SessionKeysConstants
{
public static readonly string SMSNotificationsSearchClient = "SMSNotificationsSearchClient";
}
我正在使用这样的自定义属性:
[CheckSession(SessionKey = SessionKeysConstants.SMSNotificationsSearchClient)]
public ActionResult Index()
{
// You need a session to enter here!
return View("Index");
}
并出现以下错误:
An attribute argument must be a constant expression, typeof expression
or array creation expression of an attribute parameter type
我不明白为什么,我使用的是一个常量,并且只适用于将值字符串直接分配给 SessionKey
参数。
属性参数仅限于以下类型的常量值:
- 简单类型(bool、byte、char、short、int、long、float 和 double)
- 字符串
- System.Type
- 枚举
- 对象(对象类型的属性参数的参数必须是上述类型之一的常量值。)
- 上述任何类型的一维数组
参考:https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx
如果将 SessionKeysConstants
定义为枚举,则可以解决您的问题。对于该枚举,一个命名常量是 SMSNotificationsSearchClient
.
正如@StephenMuecke 上面所说,您也可以将字符串设置为常量。
我更喜欢枚举,如果你正在寻找数据注释(例如),这在某种程度上是一个标准:https://msdn.microsoft.com/en-us/library/dd901590(VS.95).aspx
基本上你的 SessionKeysConstants
是命名常量的枚举,根据定义是 enum
,但这只是我个人的看法。
我正在尝试创建一个自定义属性来验证我的 MVC 5 应用程序的每个操作方法中的会话状态。
这是自定义属性的代码。
[AttributeUsage(AttributeTargets.Method)]
public class CheckSession : ActionFilterAttribute
{
public string SessionKey { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionParameters.ContainsKey(SessionKey))
{
string value = filterContext.ActionParameters[SessionKey] as string;
if ((string)filterContext.HttpContext.Session[value] == null)
{
var control = filterContext.Controller as Controller;
if (control != null)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary
{
{"controller", "Home"},
{"action", "Error"},
{"area", ""}
}
);
}
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
}
我正在使用的会话密钥常量:
public static class SessionKeysConstants
{
public static readonly string SMSNotificationsSearchClient = "SMSNotificationsSearchClient";
}
我正在使用这样的自定义属性:
[CheckSession(SessionKey = SessionKeysConstants.SMSNotificationsSearchClient)]
public ActionResult Index()
{
// You need a session to enter here!
return View("Index");
}
并出现以下错误:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
我不明白为什么,我使用的是一个常量,并且只适用于将值字符串直接分配给 SessionKey
参数。
属性参数仅限于以下类型的常量值:
- 简单类型(bool、byte、char、short、int、long、float 和 double)
- 字符串
- System.Type
- 枚举
- 对象(对象类型的属性参数的参数必须是上述类型之一的常量值。)
- 上述任何类型的一维数组
参考:https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx
如果将 SessionKeysConstants
定义为枚举,则可以解决您的问题。对于该枚举,一个命名常量是 SMSNotificationsSearchClient
.
正如@StephenMuecke 上面所说,您也可以将字符串设置为常量。
我更喜欢枚举,如果你正在寻找数据注释(例如),这在某种程度上是一个标准:https://msdn.microsoft.com/en-us/library/dd901590(VS.95).aspx
基本上你的 SessionKeysConstants
是命名常量的枚举,根据定义是 enum
,但这只是我个人的看法。