79 votes

Quel est le meilleur moyen de déterminer si une variable de session est nulle ou vide en C #?

Quel est le meilleur moyen de vérifier l'existence d'une variable de session dans ASP.NET C #?

J'aime utiliser String.IsNullOrEmpty fonctionne pour les chaînes et je me suis demandé s'il existait une méthode similaire pour Session . Actuellement, le seul moyen que je connaisse est:

  var sSession;
 if (Session["variable"] != null)
 {
     sSession = Session["variable"].ToString();
 }
 else
 {
     sSession = "set this";
     Session["variable"] = sSession;
 }
 

114voto

Rob Cooper Points 15945

À suivre à partir de ce que les autres ont dit. J'ai tendance à avoir deux couches:

La couche de base. C'est dans une DLL qui est ajouté à presque tous les web app projets. En cela, j'ai une SessionVars classe qui fait le gros du travail pour l'état de la Session des getters/setters. Il contient le code suivant:

    public class SessionVar
    {
    static HttpSessionState Session
    {
        get
        {
            if (HttpContext.Current == null)
                throw new ApplicationException("No Http Context, No Session to Get!");

            return HttpContext.Current.Session;
        }
    }

    public static T Get<T>(string key)
    {
        if (Session[key] == null)
            return default(T);
        else
            return (T)Session[key];
    }

    public static void Set<T>(string key, T value)
    {
        Session[key] = value;
    }
    }

Remarque les génériques pour obtenir n'importe quel type.

Je puis aussi ajouter des Getters/Setters pour des types spécifiques, en particulier de la chaîne depuis que j'ai souvent préfèrent travailler avec de la ficelle.Vide plutôt que null pour les variables présentées aux Utilisateurs.

e.g:

public static string GetString(string key)
    {
        string s = Get<string>(key);
        return s == null ? string.Empty : s;
    }

    public static void SetString(string key, string value)
    {
        Set<string>(key, value);
    }

Et ainsi de suite...

J'ai ensuite créer des wrappers pour résumé tout ça et de le ramener au modèle d'application. Par exemple, si nous avons des détails sur le client:

public class CustomerInfo
{
    public string Name
    {
        get
        {
            return SessionVar.GetString("CustomerInfo_Name");
        }
        set
        {
            SessionVar.SetString("CustomerInfo_Name", value);
        }
    }
}

Vous obtenez la bonne idée? :)

REMARQUE: Juste eu une pensée lors de l'ajout d'un commentaire à la accepté de répondre. Toujours s'assurer objets sont sérialisables lorsque les stocker dans la Session lors de l'utilisation d'un serveur d'état. Il peut être trop facile d'essayer et enregistrer un objet à l'aide de médicaments génériques, lorsque sur la batterie de serveurs web et aller boom. - Je déployer sur une batterie de serveurs web au travail donc ajouté des contrôles à mon code dans la couche de base pour voir si l'objet est sérialisable, un autre avantage de l'encapsulation de la Session Getters et Setters :)

18voto

Ely Points 1463

C'est à peu près comment vous le faites. Cependant, vous pouvez utiliser une syntaxe plus courte.

 sSession = (string)Session["variable"] ?? "set this";
 

Cela signifie que si les variables de session sont nulles, définissez sSession sur "set this"

14voto

Greg Ogle Points 3964

Il peut être plus élégant de l’envelopper dans une propriété.

 string MySessionVar
{
   get{
      return Session["MySessionVar"] ?? String.Empty;
   }
   set{
      Session["MySessionVar"] = value;
   }
}
 

alors vous pouvez le traiter comme une chaîne.

 if( String.IsNullOrEmpty( MySessionVar ) )
{
   // do something
}
 

8voto

Aaron Palmer Points 4256

Le "comme" de la notation en c# 3.0 est très propre. Puisque toutes les variables de session sont nullable objets, ce qui vous permet de saisir la valeur et la mettre dans votre propre tapé variable sans s'inquiéter de lancer une exception. La plupart des objets peuvent être traitées de cette façon.

string mySessionVar = Session["mySessionVar"] as string;

Mon concept est que vous devez tirer vos variables de Session dans les variables locales et de gérer de façon appropriée. Supposons toujours que vos variables de Session peut être null et ne jamais les jeter dans un type non nullable.

Si vous avez besoin d'un non nullable tapé variable que vous pouvez ensuite utiliser TryParse pour l'obtenir.

int mySessionInt;
if (!int.TryParse(mySessionVar, out mySessionInt)){
   // handle the case where your session variable did not parse into the expected type 
   // e.g. mySessionInt = 0;
}

1voto

StingyJack Points 10956

Vérifier pour rien / Null est le moyen de le faire.

Traiter avec les types d'objets n'est pas la solution. Déclarez un type strict et essayez de convertir l'objet au type correct. (Et utilisez l'indice de conversion ou Convert)

  private const string SESSION_VAR = "myString";
 string sSession;
 if (Session[SESSION_VAR] != null)
 {
     sSession = (string)Session[SESSION_VAR];
 }
 else
 {
     sSession = "set this";
     Session[SESSION_VAR] = sSession;
 }
 

Désolé pour les violations de syntaxe, je suis un quotidien VB'er

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X