Классическое состояние сессии корзины покупок asp.net

Я использовал этот пример для создания корзины покупок: http://net.tutsplus.com/tutorials/other/build-a-shopping-cart-in-aspnet/

Хороший пример, он хранит корзину покупок в состоянии Session["cart"] и все должно работать нормально.

НО это не так. Событие, если закрыть браузер или попробовать другие браузеры, все равно сохраняет состояние?!?!

Вот конструктор + метод добавления в корзину:

public List<CartItem> Items { get; private set; }

        // Readonly properties can only be set in initialization or in a constructor
        public static readonly ShoppingCart Instance;
        // The static constructor is called as soon as the class is loaded into memory
        static ShoppingCart()
        {
            // If the cart is not in the session, create one and put it there
            // Otherwise, get it from the session
            if (HttpContext.Current.Session["MPBooksCart"] == null)
            {
                Instance = new ShoppingCart();
                Instance.Items = new List<CartItem>();
                HttpContext.Current.Session["MPBooksCart"] = Instance;
            }
            else
            {
                Instance = (ShoppingCart)HttpContext.Current.Session["MPBooksCart"];
            }
        }
        // A protected constructor ensures that an object can't be created from outside
        protected ShoppingCart() { }

        public void AddItem(int book_id)
        {
            // Create a new item to add to the cart
            CartItem newItem = new CartItem(book_id);
            // If this item already exists in our list of items, increase the quantity
            // Otherwise, add the new item to the list
            if (this.Items.Contains(newItem))
            {
                foreach (CartItem i in Items)
                {
                    if (i.Equals(newItem))
                    {
                        i.Quantity++;
                        return;
                    }
                }
            }
            else
            {
                newItem.Quantity = 1;
                Items.Add(newItem);
            }

        }

Можете ли вы посоветовать, в чем проблема?

Я читал около 2 часов о состоянии сеанса, и везде говорится, что оно должно быть изменчивым при закрытии броузера, но в этом случае это не так.

С уважением, Алекс

1 ответ

Я не очень уверен в использовании шаблона Singleton для хранения экземпляра сеанса. Если вы думаете об этом, сеанс должен быть уникальным для каждого пользователя и каждого браузера, который обращается к веб-сайту. Шаблон Singleton создает один глобальный уникальный экземпляр. Я не знаю, сколько asp.net вы сделали, но на случай, если вы новичок в asp.net, сеанс будет уникальным для конкретного экземпляра браузера. Это означает, что каждый браузер, обращающийся к Session["MPBooksCart"], получит доступ к своей уникальной копии данных. По умолчанию сеанс asp.net будет хранить свои данные в течение 20 минут (это можно настроить в базе данных). Если бы я писал корзину для покупок, то, вероятно, просто работал бы непосредственно с таблицей корзины и таблицей картемии в базе данных. Очень хорошим примером веб-сайта магазина является приложение MVC Samples Роба Коннери. Это ASP.Net MVC-приложение, поэтому, если вы не знакомы с MVC, вам может показаться немного сложным в этом.

Другие вопросы по тегам