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,但这只是我个人的看法。