Почему при каждом нажатии на кнопку удаляются все элементы из List?
Есть такая форма.
На форме есть поле List <int> numberOfProducts В который я хочу занести информацию о количестве товара, добавленного в корзину. То есть при нажатии кнопку Добавить в список должен добавиться элемент int 2
Вот что на этим этапе показывает отладчик

Что хорошо. Но Когда я добавляю еще один товар в список, то numberOfProducts полностью обнуляется.
Мне надо передать заполненный numberOfProducts на другую страницу по нажатию на кнопку "Квитанция", но там он почему-то хранит 0 элементов. Добавление информации о количестве реализовал в соответствующих кнопках, вместе с заполнением ListBox товары к оплате
namespace WebApplication1
{
public partial class ShopForm : System.Web.UI.Page
{
protected List<int> numberOfProducts = new List<int>();
// Заполняем товары к оплате
Basket.Items.Add(new ListItem(productList.SelectedItem.Text, productList.SelectedItem.Value));
int count;
// количество товаров
if (numberTextBox.Text != "" && int.TryParse(numberTextBox.Text, out count))
{
numberOfProducts.Add(count);
}
else numberOfProducts.Add(1);
}
}
}
Почему мой List каждый раз обнуляется? Как это исправить?
Ответы (1 шт):
ASP.NET создает объект страницы заново при каждом запросе к веб-серверу. Переменные экземпляра, соответственно, при этом теряются. Статические переменные, возможно, будут сохраняться, но их время жизни ограничено временем жизни домена приложения, поэтому в них хранить состояние также нельзя - оно будет теряться в моменты, когда IIS перезагружает домен приложений. Чтобы надежно хранить состояние, можно воспользоваться одним из следующих методов:
- Хранение на стороне клиента: ViewState
- Хранение на стороне сервера: Application State, Session State
- Хранение во внешней базе данных (в сочетании с каким-либо из способов первой группы для сопоставления данных клиенту)
Пример работы с ViewState:
ViewState["list"] = new List<int> { 1, 2, 3 };
//...
var list = ViewState["list"];
Выбор между разными способами определяется объемом информации, насколько долго ее нужно хранить, требованиями к нагрузке сетевого соединения и ресурсов сервера. Способы из первой группы приводят к повышенной нагрузке на сетевое соединение, так как данные передаются туда-сюда с каждым запросом, и при закрытии страницы в браузере данные потеряются. Способы из второй группы позволяют сохранять данные между разными заходами на страницу, и больше нагружают сервер. Третья группа позволяет переложить нагрузку на внешний сервер СУБД, а также самостоятельно управлять временем жизни (как правило, используется в сочетании с аутентификацией, чтобы можно было сохранять данные даже между заходами с разных устройств).
Подробнее о способах хранения состояния можно прочитать здесь: ASP.NET State Management Recommendations


