Управление состоянием просмотра
Обновлен: Ноябрь 2007
Веб-страницы Microsoft ASP.NET могут поддерживать свое состояние при приеме-передаче данных. Когда для элемента управления задано свойство, ASP.NET сохраняет значение свойства как компонент состояния элемента управления. Что касается приложения, оказывается, что жизненный цикл страницы объединяет многочисленные запросы клиентов. Это состояние уровня страницы называется состоянием просмотра страницы.
При работе с обычными веб-страницами ASP.NET Web состояние просмотра передается сервером в виде скрытого поля в форме как часть ответа клиенту и возвращается серверу клиентом как часть обратной передачи. Однако в целях уменьшения необходимой пропускной способности при использовании элементов управления для мобильных устройств ASP.NET не отправляет клиенту состояние просмотра страницы. Вместо этого состояние просмотра сохраняется как часть пользовательского сеанса на сервере. При наличии состояния просмотра ASP.NET передает скрытое поле, которое определяет это состояние просмотра страницы как часть каждого ответа клиенту, а скрытое поле возвращается серверу клиентом как часть следующей обратной передачи.
Управление журналом состояния просмотра
Так как состояние просмотра для данной страницы должно храниться на сервере, если пользователь нажимает кнопку Назад обозревателя, существует возможность нарушения синхронизации текущего состояния, хранящегося на сервере, с текущей страницей обозревателя. Например, предположим, что пользователь переходит на страницу 1, затем нажимает кнопку для перехода на страницу 2, затем нажимает кнопку Назаддля возврата на страницу 1. Текущей страницей в обозревателе является страница 1, но на сервере сохраняется текущее состояние страницы 2.
Чтобы решить эту проблему, мобильные веб-страницы ASP.NET сохраняют журнал сведений о состоянии просмотра пользовательского сеанса. Каждый идентификатор, отправляемый клиенту, соответствует позиции в этом журнале. В предыдущем примере, если пользователь снова переходит со страницы 1, мобильная веб-страница использует идентификатор, сохраненный со страницей 1, для синхронизации журнала состояния просмотра.
Можно настроить размер данного журнала для точного соответствия требованиям приложения. По умолчанию размер равен 6, и он может быть изменен путем добавления числового атрибута к тегу в файле Web.config, как показано в следующем примере:
<configuration>
<system.web>
<mobileControls sessionStateHistorySize="10" />
</system.web>
</configuration>
Управление просроченными сеансами
Так как состояние просмотра сохраняется в пользовательском сеансе, существует вероятность завершения срока действия состояния просмотра, если на протяжении срока действия сеанса возврат на страницу не осуществляется. Это завершение срока действия является уникальной характеристикой мобильных веб-страниц. Когда пользователь помещает страницу, для которой отсутствует доступное состояние просмотра, выполняется вызов метода OnViewStateExpire страницы. При реализации этого метода по умолчанию возникает исключение, указывающее на завершение срока действия состояния просмотра. Однако если приложение предоставляет возможность восстановления состояния просмотра вручную после истечения его срока действия, можно переопределить этот метод на уровне страницы и выбрать запрет вызова базовой реализации.
Подключение и отключение состояния просмотра
Преимуществом использования сеанса для управления состоянием просмотра является то, что это приводит к уменьшению размера ответа. Недостатком является то, что неэффективное использование состояния сеанса может привести к ухудшению производительности. Если используются элементы управления, содержащие большие объемы данных, можно повысить эффективность путем использования таких методов, как пользовательская разбиения по страницам или отключение состояния просмотра. Например, рассмотрим узел, отображающий новости. Вместо сохранения содержимого статьи для каждого пользовательского сеанса узел может использовать более интеллектуальный доступ к данным, когда только одна копия статьи кэшируется на сервер и использование состояния сеанса минимизировано.
Чтобы отключить состояние просмотра для элемента управления и его дочерних элементов, установите для свойства EnableViewState элемента управления значение false. Чтобы отключить просмотр состояния всей страницы, установите для атрибута EnableViewState директивы @ Page значение false.
Даже если состояние просмотра отключено, некоторые элементы управления для мобильных устройств сохраняют важные сведения о состоянии при обмене данными с клиентом. Примером такой информации является форма, в настоящий момент активная на странице. При выключении состояния просмотра страница сохраняет эту важную информацию в качестве скрытой переменной формы, которая передается при обмене данными с клиентом.
Управление файлами Cookie и состоянием клиента
По умолчанию функциям управления сеансами ASP.NET необходимо, чтобы сервер записывал файл Cookie в клиент. Клиент последовательно отправляет Cookie при каждом запросе на протяжении сеанса, и сервер ищет сведения о состоянии сеанса с помощью сведений, содержащихся в файле Cookie. Однако многие мобильные устройства не поддерживают файлы Cookie. Чтобы обеспечить правильное выполнение управления сеансами (включая просмотр состояния) на этих устройствах, необходимо настроить приложение на управление сеансами без поддержки файлов Cookie. Если эта функция включена, ASP.NET автоматически вставляет ключ сеанса в URL-адреса приложения.
Некоторые устройства не поддерживают файлы Cookie. Чтобы сохранить долгосрочное состояние клиента, приложение может использовать сведения, относящиеся к конкретному клиенту, например номер клиента, введенный пользователем. Так как нельзя полагаться на поддержку файлов Cookie клиентом, приложение должно переходить на альтернативную страницу, для которой можно создать закладку. Далее приведен пример такой ситуации. Пользователи, которые переходят к данному URL-адресу, видят форму, в которой вводят свой код пользователя. Затем приложение отображает альтернативный URL-адрес, для которого пользователи могут создать закладку.
<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage"
Language="C#"
EnableViewState="false" %>
<script runat="server" language="c#">
protected void Page_Load(Object sender, EventArgs e)
{
String customerID = Request.QueryString["cid"];
if (customerID != null)
{
// A customer ID was found. Simulate a lookup by
// converting the client ID back to a user.
int underscore = customerID.IndexOf('_');
if (underscore != -1)
{
// If visiting the first time, prompt the user to bookmark.
if (Session["FirstTime"] != null)
{
Session["FirstTime"] = null;
WelcomeLabel.Text = String.Format("Welcome, {0}",
customerID.Substring(0, underscore));
ActiveForm = WelcomeForm;
}
else
{
ReturnLabel.Text = String.Format("Welcome back, {0}",
customerID.Substring(0, underscore));
ActiveForm = ReturnForm;
}
}
}
}
protected void LoginForm_OnSubmit(Object sender, EventArgs e)
{
// Generate a customer ID. Normally, you would create
// a new customer profile.
String customerID = CustomerName.Text + "_" +
System.Guid.NewGuid().ToString();
String path = AbsoluteFilePath + "?cid=" +
Server.UrlEncode(customerID);
Session["FirstTime"] = true;
RedirectToMobilePage(path);
}
</script>
<mobile:Form runat="server">
<mobile:Label runat="server" StyleReference="title">
Welcome to the site. Please register to continue.
</mobile:Label>
<mobile:TextBox runat="server" id="CustomerName" />
<mobile:Command runat="server" OnClick="LoginForm_OnSubmit"
Text="Register" />
</mobile:Form>
<mobile:Form id="WelcomeForm" runat="server">
<mobile:Label runat="server" id="WelcomeLabel" />
Please bookmark this page for future access.
</mobile:Form>
<mobile:Form id="ReturnForm" runat="server">
<mobile:Label runat="server" id="ReturnLabel" />
</mobile:Form>
Оптимизация состояния просмотра для мобильных приложений
При работе с мобильными веб-страницами важно соблюдать следующие рекомендации:
Сохранение состояния просмотра в состояние сеанса значительно оптимизировано. Если состояние просмотра для сохранения отсутствует, никакое состояние не сохраняется в сеансе, и идентификатор не отправляется клиенту. Однако разработчики приложений, которые хотят избежать использования управления сеансами или обеспечить высокую пропускную способность страниц, могут сократить или устранить необходимость использования состояния просмотра. Во многих случаях (например при отрисовке страницы с форматированным текстом) просмотр состояния не требуется, поэтому рекомендуется отключить его.
Помимо состояния просмотра приложения мобильная веб-страница должна сохранять другие типы сведений о состоянии для страницы. Эти сведения могут включать активную форму или сведения о разбиении на страницы для формы. Такая информация всегда передается клиенту, а не хранится на сервере, и обычно создается оптимизированным способом. Например, если первая форма является активной, или отображается первая страница формы, эти сведения не сохраняются, так как такие состояния являются состояниями по умолчанию. Такие сведения о состоянии называются состоянием для закрытого просмотра. Все элементы управления могут переопределять методы LoadPrivateViewState и SavePrivateViewState для чтения и записи состояния для закрытого просмотра.
Примечание. Для обеспечения безопасности требуется, чтобы при включении конфиденциальной информации в состояние сеанса использовалось подключение с проверкой подлинности по протоколу HTTPS и SSL/TLS.
См. также
Основные понятия
Общие сведения об управлении состоянием ASP.NET
Ссылки
Другие ресурсы
Создание веб-страниц ASP.NET для мобильных устройств