В приложениях ASP.NET существует множество способов перемещения между веб-формами: с помощью гиперссылок, с помощью Response.Redirect, с помощью Server.Transfer или с помощью Server.Execute. В этой статье будут проанализированы сходства, различия, а также преимущества и недостатки этих четырех методов навигации, чтобы помочь вам выбрать лучший метод навигации.
1. Гиперссылка.
Самый простой способ перейти в другую форму из одной формы — использовать элемент управления гиперссылкой HTML. В веб-форме используйте класс гиперссылок HTML-кода, например:
<a href="WebForm2.aspx">Введите форму 2</a>.
Когда пользователь щелкает гиперссылку, выполняется WebForm2.aspx, и результат отправляется в веб-форму. браузер. Навигацию по гиперссылкам можно использовать практически где угодно, включая страницы HTML и обычные страницы ASP.
ASP.NET также предоставляет еще один альтернативный метод—
серверный
элемент управления HyperLink
:
.aspx">Введите форму 2</asp:HyperLink>
</form>
Результат выполнения приведенного выше HTML-кода такой же, как и в первом примере, поскольку ASP.NET обрабатывает серверный веб-элемент управления HyperLink как элемент управления HTML Super Link. Но между ними есть одно важное различие. Серверные веб-элементы управления HyperLink можно программировать на стороне сервера. В частности, его свойство NavigateUrl можно изменить в программном коде, что позволяет создавать гиперссылки, конкретные цели которых могут изменяться динамически в зависимости от текущего состояния приложения, например:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e Как System.EventArgs) _
Handles Button1.Click
HyperLink1.NavigateUrl = "WebForm3.aspx"
End Sub
После выполнения этого кода, если пользователь щелкнет ссылку, он увидит WebForm3.aspx вместо WebForm2.aspx.
2. Используйте программу для управления перенаправлением.
Хотя гиперссылки могут переходить с одной страницы на другую, этот метод навигации полностью контролируется пользователем. Иногда нам может потребоваться использовать код для управления всем процессом навигации, включая время перехода на другую страницу. В таких ситуациях ASP.NET имеет три разных способа достижения схожих целей: вызов метода Redirect объекта Response и вызов метода Transfer или Execute объекта Server. Поведение этих трех методов навигации в основном похоже, но есть различия.
2.1 Response.Redirect
Метод Response.Redirect заставляет браузер ссылаться на указанный URL-адрес. Когда вызывается метод Response.Redirect(), он создает ответ с кодом состояния 302 (указывающим, что цель изменилась) и новым целевым URL-адресом в заголовках ответа. Браузер получает ответ от сервера и использует информацию в заголовке ответа для запроса нового URL-адреса.
То есть при использовании метода Response.Redirect операция перенаправления происходит на стороне клиента и включает в себя в общей сложности два сеанса связи с сервером (два туда и обратно): первый — это запрос исходной страницы, который получает 302-ответ, а второй. Второй раз — запросить новую страницу, объявленную в ответе 302, и получить страницу после перенаправления.
2.2 Server.Transfer
Метод Server.Transfer передает поток выполнения из текущего файла ASPX на другую страницу ASPX на том же сервере. При вызове Server.Transfer выполнение текущей страницы ASPX прекращается, и поток выполнения передается на другую страницу ASPX, но новая страница ASPX по-прежнему использует поток ответов, созданный предыдущей страницей ASPX.
Если вы используете метод Server.Transfer для навигации между страницами, URL-адрес в браузере не изменится, поскольку перенаправление полностью выполняется на стороне сервера, и браузер не знает, что сервер выполнил смену страницы.
По умолчанию метод Server.Transfer не передает данные формы или строки запроса с одной страницы на другую, но пока для второго параметра метода установлено значение True, данные формы первой страницы можно сохранить и выполнить запрос. нить.
В то же время при использовании Server.Transfer следует отметить одну вещь: целевая страница будет использовать поток ответов, созданный исходной страницей, из-за чего проверка машинной аутентификации ASP.NET (MAC) считает, что ViewState новой страницы был подделан. Таким образом, если вы хотите сохранить данные формы и коллекцию строк запроса исходной страницы, необходимо установить для свойства EnableViewStateMac директивы Page целевой страницы значение False.
2.3 Server.Execute
Метод Server.Execute позволяет текущей странице ASPX выполнить указанную страницу ASPX на том же веб-сервере. Когда указанная страница ASPX выполняется, поток управления возвращается в место, где исходная страница выдала Server.Execute. вызов.
Этот метод навигации по страницам аналогичен вызову функции для страницы ASPX. Вызываемая страница может получить доступ к данным формы и коллекции строк запроса вызывающей страницы, поэтому для свойства EnableViewStateMac команды Page вызываемой страницы должно быть установлено значение False.
По умолчанию выходные данные вызываемой страницы добавляются к текущему потоку ответов. Однако метод Server.Execute имеет перегруженный метод, который позволяет получать выходные данные вызываемой страницы через объект TextWriter (или его подобъект, например объект StringWriter), а не добавлять непосредственно в выходной поток, поэтому что на исходной странице вы можете легко настроить расположение результатов вывода вызываемой страницы.
Чтобы проиллюстрировать его рабочий процесс, давайте создадим веб-форму, добавим в нее элемент управления «Кнопка» (Button1) и текстовый элемент управления (Literal1), переключимся на представление кода в интерфейсе дизайна, добавим оператор Imports пространства имен System.IO и затем добавьте код, выполняемый, когда пользователь нажимает кнопку:
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim sw As StringWriter = New StringWriter()
Server.Execute( «WebForm2. aspx», sw)
Literal1.Text = sw.ToString()
End Sub
Затем создайте вторую страницу WebForm2.aspx для того же веб-приложения. Перейдите к HTML-представлению страницы и измените директиву Page, чтобы отключить проверку ViewState:
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm2.aspx.vb"
Inherits="Navigate.WebForm2" EnableViewStateMac= "false "%>
Снова перейдите в режим дизайна и добавьте элементы управления на вторую страницу. Затем установите первую страницу в качестве страницы по умолчанию и запустите приложение. Нажмите кнопку, и элемент управления WebForm2 отобразится там, где находится кнопка Literal в WebForm1, как показано на рис. 1. Обратите внимание, что заголовок страницы и URL-адрес по-прежнему отображают исходную страницу WebForm1.
Рисунок 1. Использование Server.Execute для объединения двух исходных файлов.
При использовании метода Server.Transfer или Server.Execute для реализации навигации следует отметить одну вещь: конечная страница может быть недопустимой HTML-страницей, поскольку в конечном итоге страница возвращается. клиент может содержать несколько тегов <HTML> и <BODY>. Internet Explorer, кажется, терпит и корректно справляется с этой ситуацией, но если вы хотите использовать другой браузер, вам лучше тщательно его протестировать.
3. Сравнение и выбор.
Поскольку существует множество способов перехода с одной страницы на другую, как выбрать лучший метод навигации? Вот некоторые факторы, которые следует учитывать:
· Гиперссылки лучше всего подходят, если вы хотите, чтобы пользователи решали, когда переключать страницы и на какую страницу переходить.
· Если вы хотите использовать программу для управления целью преобразования, но время преобразования определяется пользователем, используйте элемент управления HyperLink веб-сервера для динамической установки его свойства NavigateUrl.
· Если вы хотите подключить пользователя к ресурсу на другом сервере, используйте Response.Redirect.
· Используйте Response.Redirect для подключения пользователей к ресурсам, отличным от ASPX, например к HTML-страницам.
· Если вы хотите сохранить строку запроса как часть URL-адреса, используйте Response.Redirect.
· Если вы хотите перенести процесс выполнения на другую страницу ASPX на том же веб-сервере, вам следует использовать Server.Transfer вместо Response.Redirect, поскольку Server.Transfer может избежать ненужного сетевого взаимодействия, тем самым обеспечивая лучшую производительность и эффекты просмотра.
· Если вы хотите получить результаты вывода одной страницы ASPX, а затем вставить результаты в другую страницу ASPX в определенном месте, используйте Server.Execute.
· Если вы хотите убедиться, что вывод HTML является законным, используйте Response.Redirect, не используйте методы Server.Transfer или Server.Execute.
Эта статья переведена с: http://www.ondotnet.com/pub/a/dotnet/2003/04/07/aspnetnav.html.