Wie verwendet man Sitzungen in einer ASP.NET MVC 4-Anwendung?

Ich bin neu in ASP.NET MVC. Ich habe zuvor PHP verwendet und es war einfach, eine Sitzung zu erstellen und Benutzerdatensätze basierend auf den aktuellen Sitzungsvariablen auszuwählen.

Ich habe überall im Internet nach einem einfachen Schritt-für-Schritt-Tutorial gesucht, das mir zeigt, wie ich Sitzungen in meiner C# ASP.NET MVC 4-Anwendung erstellen und verwenden kann. Ich möchte eine Sitzung mit Benutzervariablen erstellen, auf die ich von überall in meinen Controllern zugreifen kann und die Variablen in meinen LINQ-Abfragen verwenden kann.

-Vielen Dank im Voraus!

Lösung

Versuchen Sie

//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;
Kommentare (9)

Aufgrund des zustandslosen Charakters des Webs sind Sitzungen auch eine äußerst nützliche Methode, um Objekte über Anfragen hinweg zu erhalten, indem sie serialisiert und in einer Sitzung gespeichert werden.

Ein perfekter Anwendungsfall wäre, wenn Sie über Ihre Anwendung hinweg auf regelmäßige Informationen zugreifen müssen. Um zusätzliche Datenbankaufrufe bei jeder Anfrage zu sparen, können diese Daten in einem Objekt gespeichert und bei jeder Anfrage desialisiert werden, etwa so:

Unser wiederverwendbares, serialisierbares Objekt:

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

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Verwendungsfall:

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

}

Sobald dieses Objekt serialisiert wurde, kann es in allen Controllern verwendet werden, ohne dass es erneut erstellt oder die Datenbank nach den darin enthaltenen Daten abgefragt werden muss.

Sitzungsobjekt mit Dependency Injection einbinden

In einer idealen Welt würden Sie Ihr serialisierbares Sitzungsobjekt mithilfe des Containers Ihrer Wahl für die Inversion der Kontrolle in Ihren Controller injizieren (in diesem Beispiel wird StructureMap verwendet, da ich damit am besten vertraut bin).

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

Sie würden dies dann in Ihrer Datei "Global.asax.cs" registrieren.

Für diejenigen, die mit dem Einfügen von Sitzungsobjekten nicht vertraut sind, gibt es einen ausführlicheren Blogbeitrag zu diesem Thema hier.

Ein Wort der Warnung:

Es ist erwähnenswert, dass Sitzungen auf ein Minimum beschränkt werden sollten, da große Sitzungen zu Leistungsproblemen führen können.

Es wird auch empfohlen, keine sensiblen Daten in ihnen zu speichern (Passwörter, etc.).

Kommentare (3)

So funktioniert der Sitzungsstatus in ASP.NET und ASP.NET MVC:

ASP.NET Session State Overview

Im Grunde tun Sie dies, um einen Wert im Session-Objekt zu speichern:

Session["FirstName"] = FirstNameTextBox.Text;

Um den Wert abzurufen:

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