Come usare le sessioni in un'applicazione ASP.NET MVC 4?

Sono nuovo di ASP.NET MVC. Ho usato PHP prima ed è stato facile creare una sessione e selezionare i record utente in base alle variabili di sessione correnti.

Ho cercato ovunque su Internet un semplice tutorial passo dopo passo che mi mostri come creare e usare le sessioni nella mia applicazione C# ASP.NET MVC 4. Voglio creare una sessione con variabili utente a cui posso accedere da qualsiasi punto dei miei controller ed essere in grado di utilizzare le variabili nelle mie query LINQ.

-Grazie in anticipo!

Soluzione

Prova

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

//to clear the session value

Session["products"]=null;
Commentari (9)

A causa della natura apolide del web, le sessioni sono anche un modo estremamente utile per persistere gli oggetti attraverso le richieste, serializzandoli e memorizzandoli in una sessione.

Un perfetto caso d'uso di questo potrebbe essere se avete bisogno di accedere a informazioni regolari attraverso la vostra applicazione, per risparmiare ulteriori chiamate al database su ogni richiesta, questi dati possono essere memorizzati in un oggetto e non serializzati su ogni richiesta, così:

Il nostro oggetto riutilizzabile e serializzabile:

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

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Caso d'uso:

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 */
    }

}

Una volta che questo oggetto è stato serializzato, possiamo usarlo in tutti i controllori senza doverlo creare o interrogare nuovamente il database per i dati contenuti al suo interno.

Iniettare l'oggetto di sessione usando Dependency Injection

In un mondo ideale si dovrebbe 'programmare su un'interfaccia, non su un'implementazione' e iniettare il proprio oggetto di sessione serializzabile nel controller usando il proprio contenitore di Inversione del Controllo di scelta, in questo modo (questo esempio usa StructureMap perché è quello con cui sono più familiare).

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

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

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

Dovresti quindi registrarlo nel tuo file Global.asax.cs.

Per coloro che non hanno familiarità con l'iniezione di oggetti di sessione, è possibile trovare un post più approfondito sul blog sull'argomento qui.

Una parola di avvertimento:

Vale la pena notare che le sessioni dovrebbero essere mantenute al minimo, sessioni di grandi dimensioni possono iniziare a causare problemi di prestazioni.

Si raccomanda inoltre di non memorizzare dati sensibili in esse (password, ecc.).

Commentari (3)

Ecco come funziona lo stato di sessione in ASP.NET e ASP.NET MVC:

Panoramica sullo stato di sessione in ASP.NET

Fondamentalmente, si fa questo per memorizzare un valore nell'oggetto Session:

Session["FirstName"] = FirstNameTextBox.Text;

Per recuperare il valore:

var firstName = Session["FirstName"];
Commentari (3)