168 votes

Variables de session en ASP.NET MVC

J'écris une application Web qui permettra à un utilisateur de naviguer vers plusieurs pages Web au sein du site Web en effectuant certaines requêtes. Toutes les informations que l'utilisateur saisit seront stockées dans un objet que j'ai créé. Le problème est que cet objet doit être accessible depuis n'importe quelle partie du site Web et je ne connais pas vraiment la meilleure façon d'y parvenir. Je sais qu'une solution consiste à utiliser des variables de session, mais je ne sais pas comment les utiliser dans asp .net MVC. Et où dois-je déclarer une variable de session ? Existe-t-il un autre moyen ?

123voto

John Leidegren Points 21951

Je pense que vous devriez vous demander si les choses ont vraiment leur place dans un état de session. C'est quelque chose que je me retrouve à faire de temps en temps et c'est une belle approche fortement typée de l'ensemble, mais vous devez être prudent lorsque vous mettez des choses dans le contexte de la session. Tout ne devrait pas être là simplement parce qu'il appartient à un utilisateur.

dans le hook global.asax l'événement OnSessionStart

void OnSessionStart(...)
{
    HttpContext.Current.Session.Add("__MySessionObject", new MySessionObject());
}

Partout dans le code où la propriété HttpContext.Current != null, vous pouvez récupérer cet objet. Je fais cela avec une méthode d'extension.

public static MySessionObject GetMySessionObject(this HttpContext current)
{
    return current != null ? (MySessionObject)current.Session["__MySessionObject"] : null;
}

De cette façon, vous pouvez en code

void OnLoad(...)
{
    var sessionObj = HttpContext.Current.GetMySessionObject();
    // do something with 'sessionObj'
}

48voto

Tomaszewski Points 1161

La réponse est correcte, mais j'ai eu du mal à la mettre en œuvre dans une application ASP.NET MVC 3. Je voulais accéder à un objet Session dans un contrôleur et je n'arrivais pas à comprendre pourquoi je continuais à obtenir une erreur "Instance not set to an instance of an Object". Ce que j'ai remarqué, c'est que lorsque j'ai essayé d'accéder à la session dans un contrôleur en faisant ce qui suit, j'ai continué à obtenir cette erreur. Cela est dû au fait que this.HttpContext fait partie de l'objet Controller.

this.Session["blah"]
// or
this.HttpContext.Session["blah"]

Cependant, ce que je voulais, c'était le HttpContext qui fait partie de l'espace de nom System.Web, car c'est celui que la réponse ci-dessus suggère d'utiliser dans Global.asax.cs. J'ai donc dû faire explicitement ce qui suit :

System.Web.HttpContext.Current.Session["blah"]

ça m'a aidé, je ne suis pas sûr d'avoir fait quelque chose qui n'est pas dans les habitudes ici, mais j'espère que ça aidera quelqu'un !

21voto

Dead.Rabit Points 817

Parce que je n'aime pas voir "HTTPContext.Current.Session" partout, j'utilise un modèle singleton pour accéder aux variables de session, ce qui vous donne un sac de données fortement typé et facile d'accès.

[Serializable]
public sealed class SessionSingleton
{
    #region Singleton

    private const string SESSION_SINGLETON_NAME = "Singleton_502E69E5-668B-E011-951F-00155DF26207";

    private SessionSingleton()
    {

    }

    public static SessionSingleton Current
    {
        get
        {
            if ( HttpContext.Current.Session[SESSION_SINGLETON_NAME] == null )
            {
                HttpContext.Current.Session[SESSION_SINGLETON_NAME] = new SessionSingleton();
            }

            return HttpContext.Current.Session[SESSION_SINGLETON_NAME] as SessionSingleton;
        }
    }

    #endregion

    public string SessionVariable { get; set; }
    public string SessionVariable2 { get; set; }

    // ...

alors vous pouvez accéder à vos données de n'importe où :

SessionSingleton.Current.SessionVariable = "Hello, World!";

14voto

robertz Points 515

Si vous utilisez asp.net mvc, voici un moyen simple d'accéder à la session.

Depuis un contrôleur :

{Controller}.ControllerContext.HttpContext.Session["{name}"]

D'un point de vue :

<%=Session["{name}"] %>

Ce n'est certainement pas la meilleure façon d'accéder à vos variables de session, mais c'est une voie directe. Utilisez-la donc avec précaution (de préférence lors d'un prototypage rapide), et utilisez un Wrapper/Container et OnSessionStart lorsque c'est approprié.

HTH

13voto

E Rolnicki Points 968

Eh bien, IMHO

  1. ne jamais référencer une session à l'intérieur de votre page de vue/master
  2. minimiser votre utilisation de la Session. MVC fournit l'obj TempData pour cela, qui est essentiellement une session qui ne vit que pour un seul voyage vers le serveur.

En ce qui concerne le point 1, j'ai une vue principale fortement typée qui possède une propriété permettant d'accéder à ce que représente l'objet Session.... dans mon cas, la vue principale fortement typée est générique, ce qui me donne une certaine souplesse en ce qui concerne les pages de vue fortement typées.

ViewMasterPage<AdminViewModel>

AdminViewModel
{
    SomeImportantObjectThatWasInSession ImportantObject
}

AdminViewModel<TModel> : AdminViewModel where TModel : class
{
   TModel Content
}

et puis...

ViewPage<AdminViewModel<U>>

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