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

je suis nouveau à ASP.NET MVC. J'ai utilisé PHP auparavant et il était facile de créer une session et de sélectionner des enregistrements d'utilisateurs basés sur les variables de session actuelles.

j'ai cherché partout sur Internet pour un simple tutoriel étape par étape qui peut me montrer comment créer et utiliser des sessions dans mon C# ASP.NET MVC 4 application. Je veux créer une session avec des variables utilisateur que je peux accéder à partir de n'importe où dans mes contrôleurs et être en mesure d'utiliser les variables dans mon LINQ requête.

-Merci d'avance!

88
demandé sur Bellash 2013-01-03 16:22:13

4 réponses

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;
134
répondu Jobert Enamno 2013-01-03 12:34:45

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

un cas d'utilisation parfaite de cela pourrait être si vous avez besoin d'accéder à des informations régulières à travers votre application, pour enregistrer des appels de base de données supplémentaires sur chaque demande, ces données peuvent être stockées dans un objet et non numérisées sur chaque demande, comme suit:

Our objet réutilisable, sérialisable:

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

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

"151990920 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 à travers tous les contrôleurs sans avoir à le créer ou à interroger la base de données pour les données qu'il contient.

injecter votre objet session en utilisant L'Injection de dépendance

Dans un monde idéal, vous serait ' programmez une interface, pas une implémentation ' et injectez votre objet Session sérialisable dans votre contrôleur en utilisant votre Inversion du conteneur de contrôle de votre choix, comme cela (cet exemple utilise StructureMap car c'est celui que je connais le plus).

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 l'enregistrez alors dans votre fichier Global.asax.cs .

pour ceux qui ne sont pas familiers avec les objets de session d'injection, vous pouvez trouver un billet de blog plus en profondeur sur le sujet ici .

un mot d'avertissement:

il est intéressant de noter que les sessions doivent être maintenues à un minimum, les grandes sessions peuvent commencer à causer des problèmes de performance.

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

52
répondu Joseph Woodward 2017-05-23 12:02:41

U peut stocker n'importe quelle valeur dans la session comme Session ["FirstName"] = FirstNameTextBox.Texte; mais je vais suggérer u à prendre comme champ statique dans le modèle lui assigner de la valeur et u peut accéder à cette valeur de champ n'importe où dans l'application. U n'a 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; }
}

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

-7
répondu Mukul Sharma 2016-04-30 04:49:57