Исправление недостатков в поддержке механизма закладок и кнопок Назад/Вперед с помощью элемента управления UpdateHistory

Платформа ASP.NET AJAX предоставляет удивительные возможности JavaScript, не обрекая вас при этом на разработку больших объемов программного кода. Таким образом, как вы уже догадались, исправление недостатков в поддержке механизма закладок и кнопок Назад/Вперед может быть реализовано за счет использования внешнего модуля и не потребует создания сценариев на JavaScript.

Сотрудник компании Microsoft Нихил Котхари (Nikhil Kothari) (архитектор команды разработчиков ASP.NET AJAX, отец языка программирования Script#, известный своим весьма информативным блогом http://nikhilk.net/) написал элемент управления, который будет здесь как нельзя кстати. Элемент управления UpdateHistory ничего не делает автоматически, но он действительно принимает на себя самые обременительные аспекты, включая весь программный код на JavaScript. Кроме того, существует еще один компонент в пакете Futures Release, который будет рассматриваться в разделе «Исправление недостатков в поддержке механизма закладок и кнопок Назад/Вперед с помощью элементов управления из пакета ASP.NET AJAX Futures» ниже в этой главе.

К моменту написания этих строк последней версией элемента UpdateHistory Нихила Котхари была версия 1.1.


Страницу, посвященную этой версии, вы можете найти в блоге по адресу: http://www.nik?hilk.net/UpdateControls11.aspx. С выходом новой версии запись в блоге будет указывать на новую версию модуля.

Когда вы загрузите код модуля Котхари, отыщите файл nStuff.UpdateControls.dll в каталоге bin. Скопируйте его в каталог bin своего сайта, построенного на базе ASP.NET AJAX. Как вариант, вы можете скопировать этот файл в глобальный кэш сборок (Global Assembly Cache – GAC), так как этот элемент управления даже подписан.

Затем создайте новый файл .aspx. Добавьте в него следующую директиву, которая загружает сборку и определяет префикс для тегов:
<%@ Register Assembly="nStuff.UpdateControls" TagPrefix="nk"
Namespace="nStuff.UpdateControls" %>

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

Следующая разметка добавляет элемент управления в страницу и подготавливает механизм обработки событий к загрузке страницы:
OnNavigate="historyNavigate" />

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


Чтобы обратиться к серверному программному коду без полной перезагрузки страницы, следует использовать элемент управления UpdatePanel. С целью демонстрации воспользуемся элементом управления ASP.NET 2.0 Wizard. При размещении его внутри UpdatePanel кнопки Назад и Вперед не работают, и потому невозможно выполнить переход на шаг назад или вперед с помощью панели инструментов броузера.
(asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional")

(asp:Wizard ID="Wizard1" runat="server" OnActiveStepChanged="stepChanged")

(asp:WizardStep runat="server" Title="Step 1")

Ready ...


(/asp:WizardStep>
(asp:WizardStep runat="server" Title="Step 2")

Set ...


(/asp:WizardStep>
(asp:WizardStep runat="server" Title="Step 3")

Go!


(/asp:WizardStep)

(/asp:Wizard)

(/asp:UpdatePanel)

В этой разметке следует отметить два важных момента. Во-первых, атрибуту UpdateMode элемента UpdatePanel присвоено значение "Conditional"; позже, при обнаружении нажатия кнопки броузера Назад или Вперед, нам потребуется обращение к программному коду на стороне сервера для обновления панели.


Во-вторых, всякий раз, когда пользователь будет производить переход к следующему шагу мастера (Wizard) (свойство OnActiveStepChanged), будет вызываться метод с именем stepChanged(). Этот метод будет записывать номер текущего шага в элемент управления UpdateHistory.

Для этого можно воспользоваться методом AddEntry(). Он ожидает получить строковый аргумент – остальные типы данных должны быть предварительно преобразованы в строку. Ниже приводится сам код:
protected void stepChanged(object sender, EventArgs e)
{
UpdateHistory1.AddEntry(((Wizard)sender).ActiveStepIndex.ToString());
}

Метод historyNavigate() вызывается при загрузке страницы или ее содержимого. Элемент управления UpdateHistory автоматически предоставит соответствующую запись из журнала посещений. После этого все, что останется сделать, – это прочитать запись и на ее основе определить шаг мастера. Не забывайте перепроверять информацию, на случай если злоумышленник попытается добавить в строку URL неверные данные:
protected void historyNavigate(object sender, HistoryEventArgs e)
{
int step = 0;
if (e.EntryName != null)
{
int.TryParse(e.EntryName.ToString(), out step);
}
if (step >= 0 && step < Wizard1.WizardSteps.Count)
{
Wizard1.ActiveStepIndex = step;
}
UpdatePanel1.Update();
}

Пример 20.1 содержит полный код этого примера.


Данный пример загружает сборку UpdateControls, добавляет в страницу элемент управления UpdateHistory и содержит программный код, необходимый для обеспечения работоспособности механизма закладок и кнопок Назад/ Вперед.

Пример 20.1. Исправление недостатков в поддержке механизма закладок и кнопок Назад/Вперед
Bookmarks.aspx
<%@ Page Language="C#" %>
<%@ Register Assembly="nStuff.UpdateControls" TagPrefix="nk"
Namespace="nStuff.UpdateControls" %>
"http://www.w3.org/TR/xhtml1/DTD/xhtml1?transitional.dtd">
ASP.NET AJAX

(body)
(asp:ScriptManager ID="ScriptManager1" runat="server" /)
OnNavigate="historyNavigate" />
(asp:UpdatePanel ID="UpdatePanel1" runat="server"
UpdateMode="Conditional")

(asp:Wizard ID="Wizard1" runat="server"
OnActiveStepChanged="stepChanged")

(asp:WizardStep runat="server" Title="Step 1")

Ready ...


(/asp:WizardStep>
(asp:WizardStep runat="server" Title="Step 2")

Set ...


(/asp:WizardStep>
(asp:WizardStep runat="server" Title="Step 3")

Go!


(/asp:WizardStep)

(/asp:Wizard)

(/asp:UpdatePane)

(/body)
.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела ASP.NET AJAX на эту тему:
Исправление недостатков программным способом
Исправление недостатков в поддержке механизма закладок и кнопок Назад/Вперед с помощью элементов управления из пакета ASP.NET AJAX Futures