2016-02-09 5 views
0

Мне нужна ясность в отношении сеанса и как добавить объекты, потому что я думаю, что делаю это неправильно.Добавить объекты в сеанс

Сначала я создать сеанс для хранения списка продуктов:

Session["ShoppingCart"] = new List<Products>(); 

Чтобы добавить продукты в список, я так:

Session["ShoppingCart"] = new Products { ID = productId, Name = name }; 

Я предполагаю, что это не верно путь?

+0

Возможный дубликат [ASP.net, добавление объектов в переменную сеанса] (http://stackoverflow.com/questions/8056323/asp-net-adding-objects-to-a-session-variable) – terbubbs

ответ

4

Я предполагаю, что это не правильный путь?

Да, это неправильный путь (пропустите последний абзац моего ответа, чтобы знать правильный путь, который вообще не должен использовать сессию ASP.NET). Правильный путь сначала получить объект, хранящийся внутри сессии, пытаясь его бросить его к тому же типу .NET лет uhave хранится внутри сессии:

var products = Session["ShoppingCart"] as List<Products>; 

, а затем, если этот элемент не пустой добавить соответствующий продукт к списку. Мы, конечно, должны сделать необходимые проверки типов, что сеанс фактически содержал значение с указанным ключом и что это значение ожидаемого типа:

if (products != null) 
{ 
    var product = new Products { ID = productId, Name = name }; 
    products.Add(product); 
} 

Конечно, мы используем ссылки на объект здесь, который будет работать только если вы сохраняете сессию в памяти (sessionState mode = InProc), которая, конечно же, является абсолютно ужасной катастрофой и что-то, чего вы никогда не должны делать в производстве. В производственной среде вы, вероятно, сохраняете свою сессию на сервере сеансов или даже на сервере SQL, не так ли? В этом случае более чем очевидно, что работа с объектными ссылками - это рецепт катастрофы. Таким образом, в этом случае, как только вы добавили новый продукт сессии вы должны, конечно, установить обратно новое значение списка на сессии, которая будет сериализовать экземпляр объекта к соответствующему хранилищу данных:

if (products != null) 
{ 
    var product = new Products { ID = productId, Name = name }; 
    products.Add(product); 
    Session["ShoppingCart"] = products; 
} 

Теперь, после того, как все при этом я должен признать, что использование сеанса ASP.NET, вероятно, является большой ошибкой, которую вы когда-либо совершали в реальном мире. Поэтому в основном каждый раз, когда вы используете Session["xxx"], вы делаете это неправильно. Просто найдите все решение для ключевого слова Session и просто избавитесь от него.

+0

Спасибо за ваш ответ! Если я понимаю, что вы говорите, я не должен использовать сеансы для корзины покупок и вместо этого хранить каждый элемент корзины в таблице SQL? Я изучаю ASP.NET MVC, и это не настоящий проект. –

+1

Я никогда не говорил, что вы должны использовать таблицу SQL. Я сказал в своем ответе, что вы никогда не должны использовать сессию ASP.NET в приложении реального мира - это не одно и то же. Таблица SQL - это всего лишь один из многих способов обработки корзины покупок в реальном мире, размещенном на веб-серверах may. –

+0

ОК, но почему сессия настолько плохая, и я не уверен, что это за альтернатива? –

0

Чтобы добавить itens в существующий список на сеансе, вы должны сначала получить список, а затем добавить к нему объект. Вот пример:

Session["ShoppingCart"] = new List<Products>(); 
List<Products> productsList = (List<Products>)Session["ShoppingCart"]; 
productsList.add(new Products { ID = productId, Name = name }); 
Session["ShoppingCart"] = productsList; 
Смежные вопросы