我正在尝试创建一个自定义属性来验证我的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
参数。
答案 0 :(得分:1)
属性参数仅限于以下类型的常量值:
参考: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
,但这只是我个人的看法。