web-dev-qa-db-fra.com

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

Je suis nouveau sur ASP.NET MVC. J'ai déjà utilisé PHP 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 didacticiel pas à pas qui me montre 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 de mes requêtes LINQ.

-Merci d'avance!

97

Essayer

//adding data to session
//assuming the method below will return list of Products

var products=Db.GetProducts();

//Store the products to a session

Session["products"]=products;

//To get what you have stored to a session

var products=Session["products"] as List<Product>;

//to clear the session value

Session["products"]=null;
144
Jobert Enamno

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

Si vous devez accéder à des informations régulières dans votre application pour enregistrer des appels de base de données supplémentaires à chaque requête, ces données peuvent être stockées dans un objet et non sérialisées à chaque requête, comme suit:

Notre objet sérialisable et réutilisable:

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

        /* From here you could output profileData.FullName to a view and
        save yourself unnecessary database calls */
    }

}

Une fois que cet objet a été sérialisé, nous pouvons l’utiliser sur tous les contrôleurs sans avoir à le créer ni à interroger à nouveau la base de données pour connaître les données qu’il contient.

Injectez votre objet de session en utilisant Dependency Injection

Dans un monde idéal, vous ' programmez sur une interface et non sur une implémentation ' et injectez votre objet de session sérialisable dans votre contrôleur à l'aide de votre conteneur de choix Inversion of Control, comme ceci (cet exemple utilise StructureMap comme tel). Je suis le plus familier avec).

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

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

        /* Create new empty session object */
        session["UserProfile"] = new UserProfileSessionData();

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

Vous enregistrez alors ceci dans votre fichier Global.asax.cs.

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

Un mot d'avertissement:

Il convient de noter que les sessions doivent être réduites au minimum. De grandes sessions peuvent commencer à causer des problèmes de performances.

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

55
Joseph Woodward

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

Présentation de l'état de session ASP.NET

En gros, 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"];
16
Leniel Maccaferri

Vous pouvez stocker tout type de données dans une session en utilisant:

Session["VariableName"]=value;

Cette variable durera environ 20 minutes.

0
Ulyses