Серверные элементы управления

от Майкрософт

ASP.NET 2.0 улучшает серверные элементы управления во многих отношениях. В этом модуле мы рассмотрим некоторые изменения архитектуры, внесенные в ASP.NET 2.0 и Visual Studio 2005 с серверными элементами управления.

ASP.NET 2.0 улучшает серверные элементы управления во многих отношениях. В этом модуле мы рассмотрим некоторые изменения архитектуры, внесенные в ASP.NET 2.0 и Visual Studio 2005 с серверными элементами управления.

Просмотр состояния

Основное изменение состояния представления в ASP.NET 2.0 — значительное уменьшение размера. Рассмотрим страницу с элементом управления "Календарь". Ниже приведено состояние представления в ASP.NET 1.1.

dDwtMTg1NDkwMjc0Nzt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxPjs
+O2w8dDxAMDxwPHA8bDxTRDs+O2w8bDxTeXN0ZW0uRGF0ZVRpbWUsIG1
zY29ybGliLCBWZXJzaW9uPTEuMC41MDAwLjAsIEN1bHR1cmU9bmV1dHJ
hbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwyMDA1LTE
xLTA4Pjs+Oz4+Oz47Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+Pjs+lkX2YWqfACtP
/VWr8G03pob/+tU=

Теперь вот состояние представления на идентичной странице в ASP.NET 2.0.

/wEPDwULLTEzNjg5MjAxMzgPZBYCAgMPZBYCAgEPPCsAC
gEADxYCHgJTRBYBBgDAEX8OsscIZGRkllfArINjlhvzQX7Xfign2q6HK5E=

Это довольно значительное изменение, и учитывая, что состояние представления переносится взад и вперед по сети, это изменение может дать разработчикам значительное увеличение производительности. Уменьшение размера состояния представления в значительной степени связано с тем, как мы обрабатываем его внутри. Помните, что состояние представления представляет собой строку в кодировке Base64. Чтобы лучше понять изменение состояния представления в ASP.NET 2.0, рассмотрим декодированные значения из приведенных выше примеров.

Вот декодировано состояние представления 1.1:

t<-1854902747;t<;l<i<1>;>;l<t<;l<
i<1>;>;l<t<@0<p<p<l<SD;>;l<l<
System.DateTime, mscorlib, Version=1.0.5000.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089<2005-11-08>;>;>>;
>;;;;;;;;;;>;;>;>>;>>;>Eaj

Это может выглядеть немного как тарабериш, но здесь есть шаблон. В ASP.NET 1.x мы использовали одинарные символы для идентификации типов данных и значений <> с разделителями с помощью символов . "t" в приведенном выше примере состояния представления представляет собой триплет. Триплет содержит пару ArrayLists ("l" представляет arrayList).) Один из этих списков ArrayList содержит int32 ("i") со значением 1, а другой — еще один триплет. Триплет содержит пару ArrayLists и т. д. Важно помнить, что мы используем триплеты, содержащие пары, идентифицируем типы данных с помощью буквы, а символы и > используются в < качестве разделителей.

В ASP.NET 2.0 состояние декодированного представления выглядит немного иначе.

-1368920138 d 
 d 
 
 
 SD 
 dddWc A ('ڮ

Вы должны заметить огромное изменение внешнего вида декодированного состояния представления. Это изменение имеет несколько архитектурных опор. Состояние просмотра в ASP.NET 1.x использовало LosFormatter для сериализации данных. В версии 2.0 мы используем новый класс ObjectStateFormatter. Этот класс был специально разработан для помощи в сериализации и десериализации состояния представления и состояния элемента управления. (Состояние элемента управления будет описано в следующем разделе.) Изменение метода сериализации и десериализации дает множество преимуществ. Одним из наиболее драматических является тот факт, что в отличие от LosFormatter, который использует TextWriter, ObjectStateFormatter использует BinaryWriter. Это позволяет ASP.NET 2.0 хранить состояние представления рядом байтов, а не строк. Возьмем, например, целое число. В ASP.NET 1.1 целое число требовало 4 байта состояния представления. В ASP.NET 2.0 для этого же целого числа требуется только 1 байт. Были внесены другие улучшения для уменьшения объема хранимого состояния представления. Например, значения DateTime теперь хранятся с помощью TickCount, а не строки.

Как будто всего этого было недостаточно, особое внимание было уделено тому факту, что одним из самых больших потребителей состояния просмотра в 1.x был DataGrid и аналогичные элементы управления. Основным недостатком таких элементов управления, как DataGrid, для состояния представления является то, что оно часто содержит большое количество повторяющихся сведений. В ASP.NET 1.x эта повторяющаяся информация просто хранилась снова и снова, что приводило к раздутым состоянию представления. В ASP.NET 2.0 для хранения таких данных используется новый класс IndexedString. Если строка повторяется, мы просто сохраняем токен для IndexedString и индекса в работающей таблице объектов IndexedString.

Состояние элемента управления

Одной из основных схваток, которые разработчики имели с состоянием представления, был размер, который он добавил в полезные данные HTTP. Как упоминалось ранее, одним из самых больших потребителей состояния представления является элемент управления DataGrid. Чтобы избежать огромного количества состояний представления, создаваемых DataGrid, многие разработчики просто отключили состояние представления для этого элемента управления. К сожалению, это решение не всегда было хорошим. Состояние представления в ASP.NET 1.x содержит не только данные, необходимые для правильной функциональности элемента управления. Он также содержит сведения о состоянии пользовательского интерфейса элемента управления. Это означает, что если вы хотите разрешить разбиение на страницы в DataGrid, необходимо включить состояние представления, даже если вам не нужны все сведения пользовательского интерфейса, содержащиеся в состоянии представления. Это сценарий "все или ничего".

В ASP.NET 2.0 состояние элемента управления решает эту проблему путем введения состояния элемента управления. Состояние элемента управления содержит данные, которые абсолютно необходимы для правильной функциональности элемента управления. В отличие от состояния представления, состояние элемента управления нельзя отключить. Поэтому важно тщательно контролировать данные, хранящиеся в состоянии управления.

Примечание

Состояние элемента управления сохраняется вместе с состоянием представления в поле __VIEWSTATE скрытой формы.

Это видео представляет собой пошаговое руководство по просмотру состояния и состояния элемента управления.

Снимок экрана: пошаговое видео, в котором описаны поля состояния представления и состояния элемента управления, в котором показано окно браузера Обозреватель Windows.

Открыть видео Full-Screen

Чтобы серверный элемент управления считывал и записывайте его в состояние элемента управления, необходимо выполнить три действия.

Шаг 1. Вызов метода RegisterRequiresControlState

Метод RegisterRequiresControlState информирует ASP.NET, что элемент управления должен сохранять состояние элемента управления. Он принимает один аргумент типа Control, который является элементом управления, который регистрируется.

Важно отметить, что регистрация не сохраняется из запроса в запрос. Поэтому этот метод должен вызываться при каждом запросе, если элемент управления должен сохранять состояние элемента управления. Рекомендуется вызывать метод в OnInit.

protected override void OnInit(EventArgs e) { Page.RegisterRequiresControlState(this); base.OnInit(e); }

Шаг 2. Переопределение SaveControlState

Метод SaveControlState сохраняет изменения состояния элемента управления с момента последней публикации. Он возвращает объект , представляющий состояние элемента управления.

Шаг 3. Переопределение LoadControlState

Метод LoadControlState загружает сохраненное состояние в элемент управления . Метод принимает один аргумент типа Object, который содержит сохраненное состояние элемента управления .

Полное соответствие XHTML

Любой веб-разработчик знает важность стандартов в веб-приложениях. Для поддержки среды разработки на основе стандартов ASP.NET 2.0 полностью соответствует XHTML. Поэтому все теги отображаются в соответствии со стандартами XHTML в браузерах, поддерживающих HTML 4.0 или более поздней версии.

Определение DOCTYPE в ASP.NET 1.1 было следующим:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN

В ASP.NET 2.0 определение DOCTYPE по умолчанию выглядит следующим образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

При желании можно изменить соответствие XHTML по умолчанию с помощью узла xhtmlConformance в файле конфигурации. Например, следующий узел в файле web.config изменит соответствие XHTML на XHTML 1.0 Strict:

<xhtmlConformance mode="Strict" />

При желании можно также настроить ASP.NET для использования устаревшей конфигурации, используемой в ASP.NET 1.x, следующим образом:

<xhtmlConformance mode="Legacy" />

Адаптивная отрисовка с помощью адаптеров

В ASP.NET 1.x файл конфигурации содержал <раздел browserCaps> , который заполнял объект HttpBrowserCapabilities. Этот объект позволил разработчику определить, какое устройство выполняет конкретный запрос, и соответствующим образом отобразить код. В ASP.NET 2.0 модель улучшилась и теперь использует новый класс ControlAdapter. Класс ControlAdapter переопределяет события в жизненном цикле элемента управления и управляет отображением элементов управления на основе возможностей агента пользователя. Возможности определенного агента пользователя определяются файлом определения браузера (файлом с расширением .browser), хранящимся в папке c:\windows\microsoft.net\framework\v2.0.****\CONFIG\Browsers.

Примечание

Класс ControlAdapter является абстрактным классом.

Как и в <разделе browserCaps> в версии 1.x, файл определения браузера использует регулярное выражение для анализа строки агента пользователя для идентификации запрашивающего браузера. Они определяют конкретные возможности для этого агента пользователя. ControlAdapter отрисовывает элемент управления с помощью метода Render. Поэтому при переопределении метода Render не следует вызывать Render в базовом классе. Это может привести к тому, что отрисовка будет выполняться дважды: один раз для адаптера и один раз для самого элемента управления.

Разработка пользовательского адаптера

Вы можете разработать собственный пользовательский адаптер, наследуя от ControlAdapter. Кроме того, можно наследовать от абстрактного класса PageAdapter в случаях, когда для страницы требуется адаптер. Сопоставление элементов управления с пользовательским адаптером выполняется с помощью <элемента controlAdapters> в файле определения браузера. Например, следующий XML-код из файла определения браузера сопоставляет элемент управления Menu с классом MenuAdapter:

<controlAdapters> <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" /> </controlAdapters>

Используя эту модель, разработчику элемента управления будет легко ориентироваться на определенное устройство или браузер. Разработчику также очень просто иметь полный контроль над тем, как страницы отрисовывается на каждом устройстве.

Отрисовка Per-Device

Свойства серверного элемента управления в ASP.NET 2.0 можно указать для каждого устройства с помощью префикса браузера. Например, приведенный ниже код изменяет текст метки в зависимости от того, какое устройство используется для просмотра страницы.

<asp:Label ID="lblBrowser" runat="server" Text="You are browsing from an unknown device." ie:Text="You are browsing from Internet Explorer." mozilla:Text="You are browsing from Firefox."> </asp:Label>

При просмотре страницы, содержащей эту метку, из Интернета Обозреватель на ней будет отображаться текст "Вы просматриваете веб-Обозреватель". При просмотре страницы из Firefox на метку будет отображаться текст "Вы просматриваете из Firefox". При просмотре страницы с любого другого устройства отображается сообщение "Вы просматриваете с неизвестного устройства". С помощью этого специального синтаксиса можно указать любое свойство.

Установка фокуса

ASP.NET разработчиков версии 1.x часто спрашивали о том, как настроить начальное внимание на определенном элементе управления. Например, на странице входа полезно иметь текстовое поле Идентификатор пользователя при первой загрузке страницы. В ASP.NET 1.x для этого требовалось написать сценарий на стороне клиента. Несмотря на то, что такой сценарий является тривиальной задачей, он больше не требуется в ASP.NET 2.0 благодаря методу SetFocus. Метод SetFocus принимает один аргумент, указывающий элемент управления, который должен получить фокус. Этот аргумент может быть идентификатором клиента элемента управления в виде строки или именем элемента управления Server в качестве объекта Control. Например, чтобы установить начальный фокус на элемент управления TextBox с именем txtUserID при первой загрузке страницы, добавьте следующий код в Page_Load:

if (!IsPostBack) {
    SetFocus(txtUserID);
}

--Или

if (!IsPostBack) {
    SetFocus(txtUserID.ClientID);
}

ASP.NET 2.0 использует обработчик Webresource.axd (описанный выше) для отрисовки клиентской функции, которая задает фокус. Имя функции на стороне клиента WebForm_AutoFocus, как показано ниже:

<script type="text/javascript"> <!-- WebForm_AutoFocus('txtUserID'); // --> </script>

Кроме того, можно использовать метод Focus для элемента управления, чтобы установить начальный фокус на этот элемент управления. Метод Focus является производным от класса Control и доступен для всех элементов управления ASP.NET 2.0. Также можно установить фокус на определенный элемент управления при возникновении ошибки проверки. Это будет описано в следующем модуле.

Новые серверные элементы управления в ASP.NET 2.0

Ниже приведены новые серверные элементы управления в ASP.NET 2.0. Мы подробно рассмотрим некоторые из них в последующих модулях.

Элемент управления ImageMap

Элемент управления ImageMap позволяет добавлять к изображению хот-споты, которые могут инициировать публикацию обратно или переходить по URL-адресу. Существует три типа хот-спотов; CircleHotSpot, RectangleHotSpot и PolygonHotSpot. Горячие точки добавляются с помощью редактора коллекций в Visual Studio или программным способом в коде. Пользовательский интерфейс для рисования хот-спотов на изображении отсутствует. Координаты, размер или радиус хот-спота должны быть указаны декларативно. Кроме того, в конструкторе отсутствует визуальное представление хот-спота. Если хот-спот настроен для перехода по URL-адресу, URL-адрес указывается с помощью свойства NavigateUrl хот-спота. В случае с хот-спотом обратной передачи свойство PostBackValue позволяет передать строку в обратной записи, которую можно получить в коде на стороне сервера.

Снимок экрана: экран редактора коллекций HotSpot, отображаемый над окном точка по умолчанию A S P X-файл.

Рис. 1. Редактор коллекций HotSpot в Visual Studio

Элемент управления BulletedList

Элемент управления BulletedList — это маркированный список, который можно легко привязать к данным. Список может быть упорядочен (нумерован) или неупорядочен с помощью свойства BulletStyle. Каждый элемент в списке представлен объектом ListItem.

Снимок экрана: раскрывающееся меню задач маркированного списка над неупорядоченным списком с наведением указателя мыши на параметр

Рис. 2. Элемент управления BulletedList в Visual Studio

Элемент управления HiddenField

Элемент управления HiddenField добавляет на страницу скрытое поле формы, значение которого доступно в коде на стороне сервера. Значение скрытого поля формы, как правило, должно оставаться неизменным между задними копиями записи. Однако злоумышленник может изменить значение перед отправкой обратной записи. В этом случае элемент управления HiddenField вызовет событие ValueChanged. Если у вас есть конфиденциальная информация в элементе управления HiddenField и вы хотите убедиться, что она остается неизменной, следует обработать событие ValueChanged в коде.

Элемент управления FileUpload

Элемент управления FileUpload в ASP.NET 2.0 позволяет отправлять файлы на веб-сервер через страницу ASP.NET. Этот элемент управления очень похож на класс HtmlInputFile ASP.NET 1.x с несколькими исключениями. В ASP.NET 1.x рекомендуется проверять свойство PostedFile на значение NULL, чтобы определить, есть ли у вас хороший файл. Элемент управления FileUpload в ASP.NET 2.0 добавляет новое свойство HasFile, которое можно использовать для той же цели и немного эффективнее.

Свойство PostedFile по-прежнему доступно для доступа к объекту HttpPostedFile, но некоторые функции HttpPostedFile теперь доступны в элементе управления FileUpload. Например, чтобы сохранить отправленный файл в ASP.NET 1.x, вызовите метод SaveAs в объекте HttpPostedFile. Используя элемент управления FileUpload в ASP.NET 2.0, можно вызвать метод SaveAs в самом элементе управления FileUpload.

Еще одним значительным изменением в поведении версии 2.0 (и, вероятно, наиболее значительным изменением) является то, что перед сохранением файла больше не нужно загружать весь отправленный файл в память. В версии 1.x все отправленные файлы сохраняются полностью в памяти перед записью на диск. Эта архитектура предотвращает отправку больших файлов.

В ASP.NET 2.0 атрибут requestLengthDiskThreshold элемента httpRuntime позволяет указать, сколько килобайт хранится в буфере в памяти перед записью на диск.

ВАЖНО! В документации MSDN (и в других местах) указано, что это значение указано в байтах (а не килобайтах), а значение по умолчанию — 256. Значение фактически указано в килобайтах, а значение по умолчанию — 80. Используя значение по умолчанию 80K, мы гарантируем, что буфер не будет помещен в кучу больших объектов.

Элемент управления "Мастер"

Довольно часто разработчики ASP.NET пытаются собрать информацию в ряду "страниц" с помощью панелей или путем переноса со страницы на страницу. Чаще всего, усилия разочаровывает один и занимает много времени. Новый элемент управления "Мастер" решает проблемы, позволяя выполнять линейные и нелинейные шаги в интерфейсе мастера, с которым знакомы пользователи. Элемент управления "Мастер" представляет формы ввода в виде последовательности шагов. Каждый шаг имеет определенный тип, заданный свойством StepType элемента управления . Доступны следующие типы шагов:

Тип шага Пояснение
Auto Мастер автоматически определяет тип шага на основе его положения в иерархии шагов.
Начать Первый шаг, часто используемый для представления вводного заявления.
Шаг Обычный шаг.
Готово Последний шаг, обычно используемый для представления кнопки для завершения работы мастера.
Завершить Представляет сообщение об успешном или неудачном выполнении.

Примечание

Элемент управления "Мастер" отслеживает свое состояние с помощью ASP.NET состояния элемента управления. Таким образом, для свойства EnableViewState можно присвоить значение false без каких-либо ущерба.

Это видео представляет собой пошаговое руководство по элементу управления "Мастер".

Снимок экрана: пошаговое руководство по элементу управления

Открыть видео Full-Screen

Локализация элемента управления

Элемент управления Localize аналогичен элементу управления Literal. Однако элемент управления Localize имеет свойство Mode , которое управляет отображением добавленной в него разметки. Свойство Mode поддерживает следующие значения:

Режим Пояснение
Преобразование Разметка преобразуется в соответствии с протоколом браузера, выполняющего запрос.
Прохождения Разметка отображается как есть.
Кодирование Разметка, добавляемая в элемент управления, кодируется с помощью HtmlEncode.

Элементы управления MultiView и View

Элемент управления MultiView выступает в качестве контейнера для элементов управления View, а элемент управления View — как контейнер (так же, как элемент управления Panel) для других элементов управления. Каждое представление в элементе управления MultiView представлено одним элементом управления Представление. Первый элемент управления Представление в MultiView — это представление 0, второй — представление 1 и т. д. Вы можете переключать представления, указав ActiveViewIndex элемента управления MultiView.

Элемент управления подстановкой

Элемент управления Подстановка используется в сочетании с ASP.NET кэшированием. В случаях, когда вы хотите воспользоваться преимуществами кэширования, но у вас есть части страницы, которые должны обновляться при каждом запросе (другими словами, части страницы, исключенные из кэширования), компонент подстановки предоставляет отличное решение. Элемент управления не отображает выходные данные самостоятельно. Вместо этого он привязывается к методу в коде на стороне сервера. При запросе страницы вызывается метод и возвращается разметка вместо элемента управления подстановки.

Метод, к которому привязан элемент управления Подстановка, указывается с помощью свойства MethodName . Этот метод должен соответствовать следующим критериям:

  • Это должен быть статический (общий в VB) метод.
  • Он принимает один параметр типа HttpContext.
  • Он возвращает строку, представляющую разметку, которая должна заменить элемент управления на странице.

Элемент управления Подстановка не может изменять любой другой элемент управления на странице, но имеет доступ к текущему httpContext через его параметр.

Элемент управления GridView

Элемент управления GridView заменяет элемент управления DataGrid. Этот элемент управления будет более подробно описан в следующем модуле.

Элемент управления DetailsView

Элемент управления DetailsView позволяет отображать одну запись из источника данных, а также изменять или удалять ее. Более подробно он рассматривается в следующем модуле.

Элемент управления FormView

Элемент управления FormView используется для отображения одной записи из источника данных в настраиваемом интерфейсе. Более подробно он рассматривается в следующем модуле.

Элемент управления AccessDataSource

Элемент управления AccessDataSource используется для привязки данных к базе данных Access. Более подробно он рассматривается в следующем модуле.

Элемент управления ObjectDataSource

Элемент управления ObjectDataSource используется для поддержки трехуровневой архитектуры, поэтому элементы управления могут быть привязаны к бизнес-объекту среднего уровня в отличие от двухуровневой модели, в которой элементы управления привязаны непосредственно к источнику данных. Более подробно она будет рассмотрена в следующем модуле.

Элемент управления XmlDataSource

Элемент управления XmlDataSource используется для привязки данных к источнику данных XML. Более подробно он рассматривается в следующем модуле.

Элемент управления SiteMapDataSource

Элемент управления SiteMapDataSource предоставляет привязку данных для элементов управления навигацией по сайту на основе карты сайта. Более подробно она будет рассмотрена в следующем модуле.

Элемент управления SiteMapPath

Элемент управления SiteMapPath отображает ряд ссылок навигации, которые обычно называют навигацией. Более подробно он рассматривается в следующем модуле.

Элемент управления Меню отображает динамические меню с помощью DHTML. Более подробно он рассматривается в следующем модуле.

Элемент управления TreeView

Элемент управления TreeView используется для отображения иерархического представления данных в виде дерева. Более подробно он рассматривается в следующем модуле.

Управление входом

Элемент управления Вход предоставляет механизм для входа на веб-сайт. Более подробно он рассматривается в следующем модуле.

Элемент управления LoginView

Элемент управления LoginView позволяет отображать различные шаблоны в зависимости от состояния входа пользователя. Более подробно он рассматривается в следующем модуле.

Управление восстановлением паролей

Элемент управления PasswordRecovery используется для получения забытых паролей пользователями ASP.NET приложения. Более подробно он рассматривается в следующем модуле.

LoginStatus

Элемент управления LoginStatus отображает состояние входа пользователя. Более подробно он рассматривается в следующем модуле.

LoginName

Элемент управления LoginName отображает имя пользователя после входа в приложение ASP.NET. Более подробно он рассматривается в следующем модуле.

CreateUserWizard

CreateUserWizard — это настраиваемый мастер, который позволяет пользователям создавать учетную запись членства ASP.NET для использования в приложении ASP.NET. Более подробно он рассматривается в следующем модуле.

ChangePassword;

Элемент управления ChangePassword позволяет пользователям изменять пароль для ASP.NET приложения. Более подробно он рассматривается в следующем модуле.

Различные веб-части

ASP.NET 2.0 поставляется с различными веб-частями. Они будут подробно рассмотрены в следующем модуле.