Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 657

Эндрю Троелсен

Но предположим, что значения вашего типа ListBox динамически указываются в файле внешнего кода поддержки, а не в рамках HTML-определения ‹form›. Сначала удалите декларации ‹asp:ListItem› из имеющегося файла *.aspx.

‹asp:ListBox ID="myListBox" runat="server"›

‹/asp:ListBox›

Затем задайте элементы списка в обработчике события Load в рамках файла с внешним кодом поддержки.

protected void Page_Load(object sender, EventArgs e) {

 if (!IsPostBack) {

  // Динамическое заполнение ListBox.

  myListBox.Items.Add("Элемент 1");

  myListBox.Items.Add("Элемент 2");

  myListBox.Items.Add("Элемент 3");

  myListBox.Items.Add("Элемент 4");

 }

}

Для обновленной страницы вы обнаружите, что при первом запросе страницы браузером значения в ListBox присутствуют и учитываются. Однако после вторичного запроса ListBox становится пустым. Первым правилом состояния представлений ASP.NET является то, что они учитывается только при наличии элементов, чьи значения динамически генерируются программным кодом. Если вы явно укажете значения в рамках дескриптора ‹form› в файле *.aspx, состояние этих элементов всегда будет восстанавливаться при вторичных запросах (даже если вы установите для enableViewState значение false для данной страницы).

Данные состояния представлений оказываются наиболее полезными при работе с динамическими Web-элементами управления, которые должны обновляться при каждом вторичном обращении к серверу (примером такого Web-элемента является элемент управления GridView ASP.NET, заполняемый при обращении к базе данных). Если вы не отключите учет состояния представлений для страниц, содержащих такие элементы, состояние таблиц будет представлено в скрытом поле__ VIEWSTATE. Сложные страницы могут содержать очень много Web-элементов управления ASP.NET, поэтому вы можете себе представить, насколько большой может быть соответствующая строка. При этом содержимое HTTP-цикла "запрос-ответ" может оказаться достаточно объемным, что может стать определенной проблемой для коммутируемых Web-соединений. В таких случаях может быть оправданным отключение учета состояния представлений для всей страницы.

Если идея отключения учета представлений для всего файла *.aspx кажется вам слишком радикальной, вспомните о том, что каждый потомок базового класса System.Web.UI.Control наследует свойство EnableViewState, с помощью которого очень просто отключить учет состояния представлений для каждого конкретного элемента управления в отдельности.

‹asp:GridView id="myHugeDynamicallyFilledDataGrid" runat="server" EnableViewState="false"

‹/asp:GridView›

Замечание. Страницы ASP.NET резервируют небольшую часть строки __VIEWSTATE для внутреннего использования. Именно поэтому поле __VIEWSTATE появляется в браузере клиента даже тогда, когда учет состояния представлений отключен для всей страницы (или для всех элементов управления).

Добавление пользовательских данных состояния представлений

В дополнение к свойству EinableViewState базовый класс System.Web. UI.Control предлагает наследуемое свойство ViewState. Это свойство в фоновом режиме обеспечивает доступ к типу System.Web.UI.StateBag, представляющему все данные поля __VIEWSTATE. С помощью индексатора типа StateBag вы можете встроить пользовательскую информацию в скрытое поле __VIEWSTATE формы, используя для этого подходящий набор пар имён и значений. Вот простой пример.