2016-10-14 1 views
0

J'essaie de créer un attribut personnalisé pour valider un état de session dans chaque méthode d'action de mon application MVC 5.ASP.NET MVC - Un argument attribut doit être une expression constante

Ceci est le code de l'attribut personnalisé.

[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); 
      } 
     } 
    } 
} 

Les constantes pour les clés de session que j'utilise:

public static class SessionKeysConstants 
{ 
    public static readonly string SMSNotificationsSearchClient = "SMSNotificationsSearchClient"; 
} 

Et j'utilise l'attribut personnalisé comme ceci:

[CheckSession(SessionKey = SessionKeysConstants.SMSNotificationsSearchClient)] 
public ActionResult Index() 
{ 
    // You need a session to enter here! 
    return View("Index"); 
} 

Et obtenir l'erreur suivante:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

Je ne suis pas sous tiens pourquoi, j'utilise une constante et ne fonctionne que dans l'attribution d'une chaîne de valeur directement au paramètre SessionKey.

+2

Il devrait être 'chaîne const publique SMSNotificationsSearchClient = « SMSNotificationsSearchClient »,' (statique ne signifie pas constant) –

+0

Il ne fonctionne pas, je reçois la même erreur. –

+0

Ensuite, vous n'avez pas utilisé le code ci-dessus (je viens de le tester et son amende) –

Répondre

1

paramètres d'attributs sont limités à des valeurs constantes des types suivants:

  • types simples (bool, byte, char, short, int, long, float et double)
  • chaîne
  • système .type
  • énumérations
  • objet (L'argument à un paramètre d'attribut d'objet de type doit être une valeur constante de l'un des types ci-dessus.)
  • tableaux à une dimension de l'un des types ci-dessus

Référence: https://msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx

Vous pouvez résoudre votre problème si vous définissez SessionKeysConstants comme ENUM. Et pour cette énumération, une constante nommée est SMSNotificationsSearchClient. Comme @StephenMuecke dit ci-dessus, vous pouvez également créer votre chaîne de caractères const.

Je préférerais un ENUM, cela est en quelque sorte une norme si vous cherchez les annotations de données (par exemple): https://msdn.microsoft.com/en-us/library/dd901590(VS.95).aspx

Fondamentalement votre SessionKeysConstants est une énumération des constantes nommées, qui par définition est un enum, mais ceci est juste mon opinion personnelle.

+0

Et une 'public static readonly string' n'est pas une' chaîne'? –

+0

Ce n'est pas une constante. –

+0

Votre réponse m'a fait réaliser la bonne façon. –