
- •6. Разработка на asp.Net. Жизненный цикл страницы, пользовательский интерфейс
- •6.1. Описание .Net Framework
- •6.1.1. Возможности среды clr
- •6.1.2. Библиотека классов платформы .Net Framework
- •6.1.3. Развитие платформы .Net
- •6.1.4. Ключевые термины
- •6.2. Обзор технологии asp.Net
- •6.2.1. Жизненный цикл Веб-страниц asp.Net
- •6.2.1.1. Общие этапы жизненного цикла страницы
- •6.2.1.2. События жизненного цикла
- •6.2.1.3. Дополнительные аспекты жизненного цикла страницы
- •6.2.2. Управление состоянием в asp.Net
- •6.2.3. Состояние просмотра ViewState
- •6.2.3.1. Сохранение объектов в состоянии просмотра
- •6.2.3.2. Оценивание преимуществ использования состояния просмотра
- •6.2.4. Строка запроса
- •6.2.4.1. Использование строки запроса
- •6.2.5. Cookie
- •6.2.6. Использование Session
- •6.2.6.1. Архитектура сеанса
- •6.2.6.2. Использование состояния сеанса
- •6.2.6.3. Поставщики состояния сеанса
- •6.2.6.3.1. Off
- •6.2.6.3.2. InProc
- •6.2.6.3.3. StateServer
- •6.2.6.3.4. SqlServer
- •6.2.7. Ключевые термины
- •6.3. Принципы разработки пользовательского интерфейса Интернет-приложений
- •6.3.1. Работа с текстом
- •6.3.2. Использование элементов CheckBox, CheckBoxList, RadioButton, RadioButtonList и BulletedList
- •6.3.3. Использование Image, ImageButton
- •6.3.4. Использование Literal и HiddenField
- •6.3.5. Использование Panel
- •6.3.7. Использование LinkButton
- •6.3.8. Ключевые термины
- •6.4. Краткие итоги
6.2.3. Состояние просмотра ViewState
Веб-элементы управления ASP.NET используют состояние просмотра по умолчанию. Оно позволяет им сохранять их свойства между отправками данных (postback). С помощью свойства ViewState можно добавить в коллекцию состояния просмотра свои собственные данные. В частности, можно здесь хранить простые типы данных и свои собственные специальные объекты.
Как и в основе большинства опций для управления состоянием в ASP.NET, в основе состояния просмотра лежит коллекция типа словаря, где каждый элемент индексируется с помощью уникального строкового имени. Например:
ViewState["CurrentPage"] = 3;
Этот код помещает в коллекцию ViewState значение 3 (или, скорее, целое число, которое содержит значение 3) и присваивает ему описательное имя CurrentPage. Если в коллекции ViewState на текущий момент нет элемента с именем CurrentPage, в нее будет автоматически добавлен такой новый элемент. Если элемент с таким именем уже существует, он будет заменен.
При извлечении значения следует использовать имя ключа. Помимо этого, также следует привести извлекаемое значение к соответствующему типу данных. Этот дополнительный шаг является обязательным, потому что коллекция ViewState сохраняет (хранит) все элементы в виде объектов обобщенного типа, что позволяет ей иметь дело со многими различными типами данных.
Ниже показан код, который извлекает значение CurrentPage и преобразовывает его в целое число:
int counter;
if (ViewState["CurrentPage"] != null)
{
counter = (int)ViewState["CurrentPage"];
}
При попытке отыскать значение, которого нет в коллекции, будет выдано исключение NullReferenceException. Чтобы исключить возможность возникновения такой ситуации, прежде чем пытаться извлечь и привести к определенному типу данные, которых может и не быть, следует выполнить проверку на наличие значения null.
6.2.3.1. Сохранение объектов в состоянии просмотра
В состоянии просмотра можно сохранять свои собственные объекты, причем так же легко как числовые и строковые типы. Однако чтобы элемент был сохранен в состоянии просмотра, ASP.NET должен быть способен преобразовать его в поток байтов для того, чтобы он мог быть добавлен в скрытое поле для ввода данных на странице. Этот процесс называется сериализацией. Если объекты не поддаются сериализации (а по умолчанию это именно так), при попытке поместить их в состояние просмотра, появится сообщение об ошибке.
Чтобы сделать объекты пригодными для сериализации, следует просто добавить перед объявлением соответствующего класса атрибут Serializable. Например, ниже показан чрезвычайно простой класс BookPage:
[Serializable]
public class BookPage
{
public int PageNamber;
public string Text;
public Customer(int pageNamber, string text)
{
PageNamber = pageNamber;
Text = text;
}
}
Поскольку класс BookPage помечен как пригодный для сериализации/поддающийся сериализации, он может быть сохранен в состоянии просмотра:
BookPage page = new BookPage (3, "Понедельник начинается в субботу");
ViewState["CurrentPage"] = page;
Не забывайте о том, что когда используются специальные объекты, при извлечении из состояния просмотра данные обязательно должны приводиться к какому-нибудь типу:
BookPage cust = (BookPage)ViewState["CurrentPage"];
Чтобы класс поддавался сериализации, он должен отвечать следующим требованиям:
он должен иметь атрибут Serializable;
все порождаемые от него классы тоже должны иметь атрибут Serializable;
все индивидуальные переменные этого класса должны представлять собой поддающиеся сериализации типы данных, а все не поддающиеся сериализации типы данных должны сопровождаться атрибутом NonSerialized (во время процесса сериализации они будут просто игнорироваться).