123 votes

Comment utiliser les sessions dans une application ASP.NET MVC 4?

Je suis nouveau dans ASP.NET MVC. J'ai utilisé PHP avant et il était facile de créer une session et de sélectionner des enregistrements d'utilisateurs en fonction des variables de session actuelles.

J'ai cherché partout sur Internet un tutoriel simple étape par étape qui pourrait me montrer comment créer et utiliser des sessions dans mon application C# ASP.NET MVC 4. Je souhaite créer une session avec des variables utilisateur auxquelles je peux accéder de n'importe où dans mes contrôleurs et pouvoir utiliser les variables dans mes requêtes LINQ.

2 votes

2 votes

170voto

Jobert Enamno Points 1639

Essayer

//ajouter des données à la session
//en supposant que la méthode ci-dessous renverra une liste de produits

var produits = Db.GetProducts();

//Stockez les produits dans une session

Session["products"] = produits;

//Pour obtenir ce que vous avez stocké dans une session

var produits = Session["products"] as List;

//pour effacer la valeur de la session

Session["products"] = null;

3 votes

Merci Jobert! tu m'as donné une idée! juste une question cependant..., est-il possible d'ajouter des variables utilisateur à une session lors de la connexion? et aurai-je accès aux variables de session (créées une seule fois) dans différents contrôleurs de mon application?

32 votes

Vous pouvez stocker n'importe quoi ou n'importe quel type de données dans une session. Une fois créée, vous pouvez accéder à la valeur stockée à travers toutes les vues et contrôleurs. Notez également que la session créée est uniquement accessible par utilisateur et par navigateur. Cela signifie que la session créée par Utilisateur1 en utilisant Firefox ne peut pas être accédée par le même utilisateur utilisant IE. Il y a aussi des choses que vous ne devriez pas faire avec une session telles que. NE stockez pas de grandes données dessus. Cela pourrait ralentir les performances de votre serveur. Enfin, NE stockez pas de données sensibles dans une session telles que le mot de passe ou le numéro de carte de crédit.

2 votes

Merci encore une fois! Où dois-je le créer pour pouvoir y accéder depuis différents contrôleurs?

68voto

JoeMighty Points 1554

En raison de la nature sans état du web, les sessions sont également un moyen extrêmement utile de persister des objets à travers les requêtes en les sérialisant et en les stockant dans une session.

Un cas d'utilisation parfait de ceci pourrait être si vous avez besoin d'accéder à des informations régulières à travers votre application, pour éviter des appels supplémentaires à la base de données à chaque requête, ces données peuvent être stockées dans un objet et désérialisées à chaque requête, comme ceci :

Notre objet réutilisable et sérialisable :

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Cas d'utilisation :

public class LoginController : Controller {

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var profileData = new UserProfileSessionData {
                UserId = model.UserId,
                EmailAddress = model.EmailAddress,
                FullName = model.FullName
            }

            this.Session["UserProfile"] = profileData;
        }
    }

    public ActionResult LoggedInStatusMessage()
    {
        var profileData = this.Session["UserProfile"] as UserProfileSessionData;

        /* À partir de là, vous pourriez afficher profileData.FullName dans une vue et
        éviter des appels inutiles à la base de données */
    }

}

Une fois cet objet sérialisé, nous pouvons l'utiliser à travers tous les contrôleurs sans avoir besoin de le recréer ou de consulter à nouveau la base de données pour les données qu'il contient.

Injectez votre objet session en utilisant l'injection de dépendances

Dans un monde idéal, vous devriez 'programmer face à une interface, pas à une implémentation' et injecter votre objet de session sérialisable dans votre contrôleur en utilisant votre conteneur d'Inversion de Contrôle préféré, comme ceci (cet exemple utilise StructureMap car c'est celui avec lequel je suis le plus familier).

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());   
    }

    public static IUserProfileSessionData GetUserProfileFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["UserProfile"] != null)
        {
            return session["UserProfile"] as IUserProfileSessionData;
        }

        /* Créer un nouvel objet de session vide */
        session["UserProfile"] = new UserProfileSessionData();

        return session["UserProfile"] as IUserProfileSessionData;
    }
}

Vous devrez ensuite enregistrer ceci dans votre fichier Global.asax.cs.

Pour ceux qui ne sont pas familiers avec l'injection d'objets de session, vous pouvez trouver un article de blog plus détaillé sur le sujet ici.

Un avertissement :

Il convient de noter que les sessions doivent être maintenues au minimum, des sessions volumineuses peuvent commencer à causer des problèmes de performance.

Il est également recommandé de ne pas y stocker de données sensibles (mots de passe, etc).

0 votes

Où placeriez-vous la définition de la classe cependant ? Je suis encore assez nouveau à tout cela, mais je suis juste curieux de savoir comment les autres contrôleurs verront la classe et sauront ce que c'est. Vous venez de l'ajouter en haut du contrôleur ? Je pensais à SessionStart dans global.asax je vais initialiser les choses mais peut-être que ce n'est pas la meilleure façon de le faire.

0 votes

@Shaun314 Idéalement, vous devriez utiliser un conteneur IoC pour injecter l'objet dans votre contrôleur via l'injection de dépendance (voir l'édition).

1 votes

Je stocke des informations de session après la connexion de l'utilisateur en utilisant Identity 2. Je ne parviens pas à récupérer ces informations dans d'autres actions et contrôleurs que la première action vers laquelle je redirige l'utilisateur. Des idées?

18voto

Leniel Macaferi Points 38324

Voici comment fonctionne l'état de session en ASP.NET et ASP.NET MVC:

Aperçu de l'état de session ASP.NET

Essentiellement, vous faites ceci pour stocker une valeur dans l'objet Session:

Session["FirstName"] = FirstNameTextBox.Text;

Pour récupérer la valeur:

var firstName = Session["FirstName"];

10 votes

Il n'y a pas de session de contrôleur croisée, donc lorsque vous demandez un autre contrôleur, par exemple de Account à Home, Session["FirstName"] est nul. Les développeurs doivent créer un BaseController et définir un champ protégé (internal protected HttpSessionStateBase SharedSession) qui peut exposer la variable de session partagée dans tous les sous-contrôleurs (cela suppose que tous les contrôleurs de votre application héritent du BaseController).

6 votes

Umm, bien sûr ? Il y a une variable de Session dans le Contrôleur (le contrôleur de base fourni par MVC).

8 votes

@Bellash c'est complètement faux. Les sessions sont disponibles à travers les contrôleurs. J'ai simplement défini Session["test"] dans HomeController puis je l'ai lu dans mon AccountController.

0voto

Ulyses Points 71

Vous pouvez stocker n'importe quel type de données dans une session en utilisant :

Session["NomVariable"]=valeur;

Cette variable durera environ 20 minutes.

-8voto

Mukul Sharma Points 1

Vous pouvez stocker n'importe quelle valeur en session comme Session["FirstName"] = FirstNameTextBox.Text; mais je vous suggère de la prendre comme champ statique dans le modèle, d'y assigner une valeur et vous pourrez accéder à cette valeur de champ n'importe où dans l'application. Vous n'avez pas besoin de session. La session doit être évitée.

public class Employee
{
   public int UserId { get; set; }
   public string EmailAddress { get; set; }
   public static string FullName { get; set; }
}

dans le contrôleur - Employee.FullName = "ABC"; Maintenant vous pouvez accéder à ce nom complet n'importe où dans l'application.

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