Πώς να χρησιμοποιήσετε συνεδρίες σε μια εφαρμογή ASP.NET MVC 4;

Είμαι νέος στο ASP.NET MVC. Έχω χρησιμοποιήσει PHP πριν και ήταν εύκολο να δημιουργήσω μια συνεδρία και να επιλέξω εγγραφές χρηστών με βάση τις τρέχουσες μεταβλητές συνεδρίας.

Έψαξα παντού στο Διαδίκτυο για ένα απλό βήμα προς βήμα σεμινάριο που να μπορεί να μου δείξει πώς να δημιουργώ και να χρησιμοποιώ συνεδρίες στην εφαρμογή μου C# ASP.NET MVC 4. Θέλω να δημιουργήσω μια συνεδρία με μεταβλητές χρήστη στις οποίες μπορώ να έχω πρόσβαση από οπουδήποτε στους ελεγκτές μου και να μπορώ να χρησιμοποιώ τις μεταβλητές στα ερωτήματα LINQ.

-Ευχαριστώ εκ των προτέρων!

Λύση

Δοκιμάστε το

//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;
Σχόλια (9)

Λόγω της μη καταστατικής φύσης του διαδικτύου, οι σύνοδοι είναι επίσης ένας εξαιρετικά χρήσιμος τρόπος για τη διατήρηση αντικειμένων σε διάφορες αιτήσεις, με τη σειριοποίησή τους και την αποθήκευσή τους σε μια σύνοδο.

Μια τέλεια περίπτωση χρήσης αυτού θα μπορούσε να είναι αν χρειάζεται να έχετε πρόσβαση σε τακτικές πληροφορίες σε όλη την εφαρμογή σας, για να γλιτώσετε πρόσθετες κλήσεις βάσης δεδομένων σε κάθε αίτηση, τα δεδομένα αυτά μπορούν να αποθηκευτούν σε ένα αντικείμενο και να μη σειροποιηθούν σε κάθε αίτηση, ως εξής:

Το επαναχρησιμοποιήσιμο, σειριοποιήσιμο αντικείμενό μας:

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

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

Περίπτωση χρήσης:

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

}

Μόλις αυτό το αντικείμενο σειριοποιηθεί, μπορούμε να το χρησιμοποιήσουμε σε όλους τους ελεγκτές χωρίς να χρειάζεται να το δημιουργήσουμε ή να κάνουμε ξανά ερώτημα στη βάση δεδομένων για τα δεδομένα που περιέχονται σε αυτό.

Ενσωμάτωση του αντικειμένου της συνεδρίας σας χρησιμοποιώντας Dependency Injection

Σε έναν ιδανικό κόσμο θα 'προγραμματίζετε σε μια διασύνδεση, όχι υλοποίηση' και θα εγχέετε το σειριοποιήσιμο αντικείμενο συνόδου σας στον ελεγκτή σας χρησιμοποιώντας το δοχείο Inversion of Control της επιλογής σας, ως εξής (αυτό το παράδειγμα χρησιμοποιεί το StructureMap καθώς είναι αυτό με το οποίο είμαι πιο εξοικειωμένος).

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

Στη συνέχεια, θα το καταχωρήσετε αυτό στο αρχείο σας Global.asax.cs.

Για όσους δεν είναι εξοικειωμένοι με την εισαγωγή αντικειμένων συνόδου, μπορείτε να βρείτε μια πιο λεπτομερή δημοσίευση στο blog σχετικά με το θέμα εδώ.

Μια προειδοποίηση:

Αξίζει να σημειωθεί ότι οι σύνοδοι θα πρέπει να περιορίζονται στο ελάχιστο, οι μεγάλες σύνοδοι μπορούν να αρχίσουν να προκαλούν προβλήματα απόδοσης.

Συνιστάται επίσης να μην αποθηκεύετε σε αυτές ευαίσθητα δεδομένα (κωδικούς πρόσβασης κ.λπ.).

Σχόλια (3)

Έτσι λειτουργεί η κατάσταση συνεδρίας στο ASP.NET και στο ASP.NET MVC:

ASP.NET Session State Overview

Βασικά, το κάνετε αυτό για να αποθηκεύσετε μια τιμή στο αντικείμενο Session:

Session["FirstName"] = FirstNameTextBox.Text;

Για να ανακτήσετε την τιμή:

var firstName = Session["FirstName"];
Σχόλια (3)