Як використовувати сесії в 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.

Для тих, хто не знайомий з ін'єкцією об'єктів сеансу, ви можете знайти більш детальну статтю в блозі на цю тему тут.

**Слово попередження

Варто зазначити, що сеанси повинні бути зведені до мінімуму, великі сеанси можуть почати викликати проблеми з продуктивністю.

Також не рекомендується зберігати в них будь-які конфіденційні дані (паролі тощо).

Коментарі (3)

Так працює стан сесії в ASP.NET та ASP.NET MVC:

Огляд стану сеансу ASP.NET.

В основному, це робиться для того, щоб зберегти значення в об'єкті Session:

Session["FirstName"] = FirstNameTextBox.Text;

Щоб отримати значення:

var firstName = Session["FirstName"];
Коментарі (3)