Классическое состояние сессии корзины покупок 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, вам может показаться немного сложным в этом.