ASP.NET MVC - 属性参数必须是常量表达式

时间:2016-10-14 21:34:27

标签: asp.net-mvc custom-attributes

我正在尝试创建一个自定义属性来验证我的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");
}

收到以下错误:

  

属性参数必须是常量表达式,typeof表达式   或属性参数类型

的数组创建表达式

我不明白为什么,我正在使用常量,只能将值字符串直接分配给SessionKey参数。

1 个答案:

答案 0 :(得分:1)

属性参数仅限于以下类型的常量值:

  • 简单类型(bool,byte,char,short,int,long,float和double)
  • 字符串
  • 的System.Type
  • 枚举
  • object(对象类型的属性参数的参数必须是上述类型之一的常量值。)
  • 任何上述类型的一维阵列

参考:https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx

如果您将SessionKeysConstants定义为枚举,则可以解决问题。对于那个枚举,一个名为常数的是SMSNotificationsSearchClient

正如@StephenMuecke上面所说,你也可以使你的字符串const。

我更喜欢枚举,如果您正在寻找数据注释(例如),这在某种程度上是一个标准:https://msdn.microsoft.com/en-us/library/dd901590(VS.95).aspx

基本上你的SessionKeysConstants是命名常量的枚举,根据定义是enum,但这只是我个人的看法。