Роб Ховард
Когда я был ребенком, я каждый год проводил несколько недель, тусуясь со своей большой семьей. Будучи молодым американским мальчиком, я был очарован голландскими электропоездами, чего я никогда не видел в своем родном городе Далласе, штат Техас. Мои двоюродные братья угостили меня покататься на их лодке, чтобы понаблюдать за проходящим поездом. Сидя на воде рядом с путями, вы можете слышать приближающийся поезд, словно тихий свист по путям, пока он не разыграет медленную кульминацию, когда поезд проедет мимо. Я не мог не вспомнить об этом, думая об ASP.NET 2.0. ASP.NET 2.0 очень близок, и большинство из нас с нетерпением ожидают его выпуска настолько скоро, что мы даже слышим «ух!», что релиз продолжает становиться все громче и громче. Тогда то, как мы пишем программное обеспечение, снова изменится.
Цель Microsoft ASP.NET 2.0 — предоставить разработчикам производительность на 50%. Однако фактическое улучшение производительности, похоже, превосходит ожидания. Новые функции персонализации, членства и управления ролями снимают нагрузку с разработчиков, а другие функции, такие как привязка данных, также упрощены. Например, знакомый и до сих пор поддерживаемый синтаксис:
<%# DataBinder.Eval (Container.DataItem, «FirstName») %>
В ASP.NET 2.0 это можно упростить до:
<%# Eval("FirstName") %>
Появилось не только множество впечатляющих новых функций, но и множество значимых элементов управления сервером. Модель программирования ASP.NET станет еще более мощной в ASP.NET 2.0 благодаря интеграции членства с серверными элементами управления, такими как элемент управления <ASP:login>, а также новыми источниками данных и серверными элементами управления данными.
Число библиотек классов System.Web в ASP.NET 2.0 почти удвоилось — настолько широкое освещение, что для этого требуется даже колонка в журнале. Чтобы по-настоящему понять масштабы этих изменений, вам понадобится новая книга ASP.NET 2.0. Я планирую написать здесь несколько статей, чтобы осветить некоторые наиболее важные новые возможности ASP.NET 2.0. В этом месяце я собираюсь сосредоточиться на навигации и навигации по страницам, начиная с очень востребованной функции — возможности отправлять сообщения на другие страницы.
Межстраничная доставка
Самая большая жалоба, которую я слышу от разработчиков, переходящих на ASP.NET, связана с моделью обратной передачи страниц. Страницы ASP.NET могут иметь одну <form> и могут отправлять обратную связь только по HTTP, поэтому вся обработка Вся логика будет выполняться. эту страницу.
Многие разработчики, особенно те, кто знаком с ASP и любит управлять элементом <form>, знают, что в ASP вы можете указать <form>, куда и как отправлять данные содержимого (HTTP Post или HTTP Get), а также на той же странице Количество <форма>. Но по сравнению с ASP, ASP.NET позволяет странице иметь только один <form runat=server>, и его можно отправить обратно только самому себе. Это может быть очень неприятно. Вот пример того, что отправляется на другие страницы в ASP.NET 2.0:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="Source.aspx.cs"
Наследует="Источник" %>
<ASP:Content ID="MainContent"
ContentPlaceHolderID="Основной" Runat="сервер">
Введите свое имя:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="server" Text="Submit" />
</ASP:Содержание>
Главные страницы используются для управления макетом страницы с блоком <ASP:content> и некоторыми серверными элементами управления для приема пользовательского ввода.
Если вы планируете передать содержимое на другую страницу, вы можете использовать код сервера, аналогичный следующему:
Response.Redirect("Target.aspx?Name= " +
HttpUtility.UrlEncode(NameBox.Text));
Проблема с этой технологией заключается в том, что когда пользователь нажимает кнопку отправки, сервер принимает запрос и отправляет ответ, чтобы перенаправить браузер на Target.aspx. Такая простая проблема проделала большую работу!
Можно ли упростить работу? В ASP.NET 2.0 ответ — да. Затем продемонстрируйте улучшенный код:
<%@ Page MasterPageFile="~/Site.master" Language="C#"
CodeFile="Source.aspx.cs"
Наследует="Источник" %>
<ASP:Content ID="MainContent"
ContentPlaceHolderID="Основной" Runat="сервер">
Введите свое имя:
<ASP:TextBox ID="NameBox" Runat="server"></ASP:TextBox>
<ASP:Button ID="Button1" Runat="server" Text="Отправить"
PostBackUrl="~/Target.aspx" />
</ASP:Содержимое>
Обратите внимание на атрибут PostBackUrl в <ASP:Button>. Этот атрибут указывает кнопке не выполнять обратную передачу по умолчанию, а отправлять данные непосредственно в Target.aspx.
Вам может быть интересно, как это работает, особенно если вы знакомы с ASP.NET ViewState. объект. Но это выходит за рамки данной статьи: при использовании функции межстраничной доставки на страницу будет добавлено новое скрытое поле:
<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE"
value="p1-dFHlCpgH2alr1vkr3G21UIR7jOuzn074led6lbGf1KQ47_F25GwG0" />
Это немного похоже на состояние просмотра, генерируемое деревом управления, но это фрагмент состояния просмотра, который проверяет страницу на возможность межстраничной доставки. Знаете, когда страница пересылается на другую страницу, принимающая страница должна иметь доступ к экземпляру страницы публикации. В данном случае это означает, что Target.ASP может получить доступ к сведениям о Source.aspx. Фактически, более эффективный подход — получить доступ к API из Source.aspx в Target.aspx через строго типизированный менеджер. Чтобы получить доступ к странице доставки (предыдущая страница), ASP.NET2.0 предоставляет атрибут страницы для межстраничной доставки: Предыдущая страница.
Предыдущая страница возвращает экземпляр страницы доставки, а также есть свойство, используемое для проверки того, является ли это межстраничная доставка: IsCrossPagePostBack. Это свойство похоже на существующее свойство IsPostBack, но возвращает true только в том случае, если происходит межстраничная публикация.
Свойство Предыдущая страница может вести себя по-другому. По умолчанию оно просто возвращает экземпляр предыдущей страницы как тип страницы. Однако с помощью новой директивы вы можете заставить свойство Предыдущая страница возвращать строго типизированный экземпляр для доступа к общедоступным членам страницы. Например, добавьте в Target.aspx следующий код:
<%@ПредыдущийPageType VirtualPath="~/Source.aspx" %>
Теперь вы можете использовать свойствоПредыдущая страница в Target.aspx для доступа к данным Source.aspx. Однако для доступа к серверному элементу управления, такому как NameBox в Source.aspx, вам также необходимо написать следующий код:
TextBox nameBox = previousPage.FindControl("NameBox") as TextBox.
Другими словами, вы должны использовать FindControl для; доступ к дереву управления. Почему? Серверные элементы управления по умолчанию используют защищенные переменные-члены. Чтобы иметь по-настоящему простой доступ к элементам предыдущей страницы, вам необходимо предоставить свойство или метод в Source.aspx как общедоступное, и тогда будет работать следующий код: TextBox nameBox. = НазадPage. NameBox;
Межстраничная доставка — замечательная функция ASP.NET. Есть несколько статей, в которых подробно обсуждаются технические детали межстраничной доставки. Вырезка Дино Эспозито в сентябрьском выпуске колонки MSDN Magazine Edge (см. мой перевод: Форма ASP.NET (перевод)). Вы также, вероятно, обнаружите, что если вы хорошо владеете ASP.NET, вы будете большую часть времени продолжать использовать стандартную модель обратной передачи страницы. (Переводчик: Подразумевается, что если вы эксперт, вы будете пренебрегать этой функцией.)
Мастер управления
может легко создать сложную функцию навигации для приложения посредством межстраничной доставки. Однако эта функция не упрощает создание пользовательских интерфейсов в стиле мастера. Пользовательские интерфейсы в стиле мастера, линейные или нелинейные, часто предназначены для выполнения задач. Он предоставляет конечным пользователям удобный способ выполнения сложной серии шагов, каждый из которых разбит на этапы.
В ASP.NET 1.x мастера часто реализовывались с использованием нескольких приемов: размещение нескольких серверных элементов управления <ASP:panel> на одной странице и переключение видимости в зависимости от местоположения пользователя. Написание мастера в ASP.NET — непростая задача. Многие проектировщики отказываются от мастера, а управление пошаговым процессом также вызывает путаницу.
Новые возможности межстраничной доставки в ASP.NET можно использовать для решения проблемы мастера, но это также проблема, когда требуется нелинейная навигация. Например, шаг 1, шаг 2, пропуск шагов 3–5, шаг 6, шаг 3, шаг 2, шаг 6, элемент управления мастера ASP.NET 2.0 решает большинство этих проблем. Кроме того, все элементы ввода мастера межстраничной доставки постоянно доступны через модель обратной передачи страницы.
Функциональность элемента управления мастера очень близка к способу скрытия панелей в ASP.NET 1.1. Однако элемент управления мастера предоставляет серию <ASP:WizardStep>, которая может содержать любое количество дочерних элементов управления. Однако каждый <ASP:WizardStep> должен иметь свой собственный уникальный идентификатор, см. рисунок 1. Страница управления мастером управляет всей навигацией, поддерживает линейную и нелинейную навигацию и имеет полную поддержку во время разработки. На рис. 2 показан элемент управления мастера. Левая часть представляет собой нелинейную навигацию на основе ссылок, а нижняя правая часть — линейную навигацию с помощью кнопок. В открывшемся меню задач вы можете увидеть не просто общую задачу, а список шагов, позволяющий переключаться между шагами во время разработки.
Рисунок 2. Мастер в Visual Studio.
Все видимые элементы элемента управления мастера можно настроить. Нелинейные ссылки можно заменить кнопками или удалить записи, а предыдущие, следующие и завершенные линейные элементы навигации также можно заменить на кнопки с изображениями или ссылки. Фактически, все аспекты управления можно настроить с помощью шаблонов.
Одной из трудностей при написании элементов управления мастера в ASP.NET 1.1 было управление тем, где должен находиться пользователь. Элемент управления мастера упрощает эту задачу, предоставляя свойство ActiveStep. Свойство ActiveStep может запрашивать и определять, какой шаг активен в данный момент. Естественный поток работы мастера будет действовать так, как заявлено реализацией, и его можно изменить в любой момент с помощью метода MoveTo. С помощью MoveTo любой шаг можно установить как ActiveStep. Для облегчения навигации и обработки также предусмотрено несколько событий, см. рисунок 3.
Новый элемент управления «мастер» очень полезен при сборе информации о пользователях. Вам не нужно писать все базовые структуры в ASP.NET 1.1. ASP.NET сделал всю работу за вас. Элемент управления Wizard настолько полезен, что команда ast.net использует его в качестве базового класса для элемента управления CreateUserWizard, который используется для создания пользователей как часть функции Membership.
Разделы
Межстраничная публикация и элемент управления <ASP:Wizard> предоставляют разработчикам ASP.NET несколько новых возможностей для управления потоком навигации в их приложениях. Межстраничная доставка полезна в ситуациях, когда вам в данный момент необходимо использовать Response.Redirect или Server.Transfer. Элементы управления мастера отлично подходят для создания сложных коллекций данных, требующих как линейного, так и нелинейного сбора данных.
-------------------------------------------------- ------
Рис. 1. Действия мастера
<ASP:Wizard runat="server" >
<Шаги мастера>
<ASP:WizardStep ID="Шаг1">
Добро пожаловать!
</ASP:WizardStep>
<ASP:WizardStep ID="Шаг2">
Как вас зовут: [TextBox1]
[Кнопка1]
</ASP:WizardStep>
<ASP:WizardStep ID="Шаг3">
Спасибо, [TextBox1.Text]!
</ASP:WizardStep>
</WizardSteps>
</ASP:Wizard>
-------------------------------------------- --- ----------
Рис. 3. События навигации
Событие | Описание |
---|---|
ActiveStepChanged | Вызывается, когда ActiveStep установлен на новый WizardStep. |
CancelButtonClick | Вызывается, когда нажимается кнопка, определенная как кнопка «Отмена». |
FinishButtonClick | Вызывается, когда нажимается кнопка, определенная как кнопка «Готово |
NextButtonClick | Вызывается, когда кнопка, идентифицированная как «Далее» Кнопка нажата.ПредыдущийButtonClick |
Вызывается при нажатии кнопки, идентифицированной как Предыдущая кнопка | . |
SideBarButtonClick | Вызывается при нажатии одной из ссылок или кнопок боковой панели. |