Итак, ваша проблема здесь связана с управлением состоянием, и по большей части вы несете ответственность за управление состоянием элементов на вашей странице. Учтите, что эта страница может отображаться 100 раз в минуту (до 100 разных браузеров), и каждая из них может иметь свое состояние. Сервер не может отслеживать все эти различные экземпляры и состояния, вы должны это сделать.
Есть два способа справиться с этим, самый простой из них аналогичен тому, что указано в @StackOverflowException, просто убедитесь, что вы определяете и устанавливаете свое состояние каждый при создании вашей страницы. Это проще, но определенно не масштабируемо, особенно если это требует много работы с базой данных и прочего.
Лучшее решение - создать собственные свойства, которые хранят вещи на страницах ViewState. Есть много способов сделать это, но вот небольшой пример:
protected override OnPageLoad(EventArgs e)
{
myListBox.Items.AddRange(myListItems);
}
protected IEnumberable<ListItems> myListItems
{
get
{
IEnumberable<ListItems> items = (IEnumerable<ListItems>)ViewState["myListItems"];
// Build the list if we can't get it out of the viewstate
if(items = null)
{
items = BuildListItems();
ViewState["myListItems"] = items;
}
return _items;
}
set { ViewState["myListItems"] = value; }
}
Это займет немного больше времени при начальном просмотре страницы, но во время обратной передачи (теоретически) будет быстрее, потому что он может вывести список из состояния просмотра страницы, не восстанавливая его (в основном десериализовав его).
Недостатком этого метода является то, что ваше состояние просмотра, которое выводится в браузер, может стать очень большим, если вы поместите в него слишком много данных.