Поделиться через


Межстраничная запись данных на веб-страницах ASP.NET

Обновлен: Ноябрь 2007

По умолчанию кнопки и другие элементы управления веб-страницы ASP.NET, вызывающие обратную передачу, выполняют обратную передачу страницы самой себе. Такое поведение является частью стандартного цикла обработки веб-страницы ASP.NET. Дополнительные сведения см. в разделе Знакомство с веб-страницами ASP.NET.

В некоторых случаях требуется реализовать передачу страницы другой странице. Например, такое поведение может потребоваться при работе с многостраничной формой, на каждой странице которой собирается различная информация. В этом случае можно настроить определенные элементы управления, реализующие интерфейс IButtonControl, например элемент Button, на передачу страницы другой целевой странице. Такой процесс называется межстраничной записью данных. Применение межстраничной записи данных для перенаправления на другую страницу имеет ряд преимуществ по сравнению с использованием метода Transfer. Дополнительные сведения см. в разделе Перенаправление пользователей на другую страницу.

ms178139.alert_note(ru-ru,VS.90).gifПримечание.

Также можно использовать элемент управления Wizard для создания форм с несколькими представлениями. Дополнительные сведения см. в разделе Общие сведения о серверном веб-элементе управления Wizard.

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

Получение сведений с исходной страницы

Межстраничная запись данных в большинстве случаев используется для получения сведений с исходной страницы. К ним могут относиться сведения, передаваемые обозревателем, а также открытые свойства исходной страницы.

Получение значений элементов управления

В классе Page предоставляется свойство с именем PreviousPage. Если исходная и целевая страницы находятся в одном приложении ASP.NET, свойство PreviousPage целевой страницы содержит ссылку на исходную. (Если страница не является целевой в процессе межстраничной записи данных или страницы располагаются в различных приложениях, свойство PreviousPage не инициализируется.) По умолчанию свойство PreviousPage типизируется как Page.

ms178139.alert_note(ru-ru,VS.90).gifПримечание.

Если исходная и целевая страницы располагаются в различных приложениях, непосредственное получение значений элементов управления страницы не поддерживается. В этом случае можно считать передаваемые данные из словаря Form. Считывание состояния представления не поддерживается, поскольку оно хэшируется. Чтобы сохранить значения на исходной странице и сделать их доступными на целевой странице другого приложения, можно сохранить их в виде строковых значений в скрытых полях. В этом случае обращение к ним осуществляется с помощью метода Request.Form.

С помощью ссылки, хранящейся в свойстве PreviousPage, можно выполнить поиск элементов управления на исходной странице и извлечение их значений. Для этого обычно используется метод FindControl.

ms178139.alert_note(ru-ru,VS.90).gifПримечание.

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

В следующем примере показано получение значения элемента управления TextBox1 исходной страницы.

If Not Page.PreviousPage Is Nothing Then
    Dim SourceTextBox As TextBox
    SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
        TextBox)
    If Not SourceTextBox Is Nothing Then
        Label1.Text = SourceTextBox.Text
    End If
End If
if (Page.PreviousPage != null)
{
    TextBox SourceTextBox = 
        (TextBox)Page.PreviousPage.FindControl("TextBox1");
    if (SourceTextBox != null)
    {
        Label1.Text = SourceTextBox.Text;
    }
}

Метод FindControl обеспечивает поиск элементов управления в текущем контейнере именования. Если искомый элемент управления размещается внутри другого элемента (обычно внутри шаблона), сначала необходимо получить ссылку на контейнер, а затем выполнить поиск необходимого элемента в контейнере. В следующем примере на странице содержится элемент управления Login с контейнером LayoutTemplate, который, в свою очередь, содержит элемент управления TextBox с именем UserName. В коде возвращается значение элемента управления UserName.

Dim LoginControl As Login
LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
If Not LoginControl Is Nothing Then
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)
    If Not UserName Is Nothing Then
        Label1.Text = UserName.Text
    End If
Else
    Label1.Text = "Cannot find user name in Login control."
End If
Login LoginControl = (Login)PreviousPage.FindControl("Login1");
if (LoginControl != null)
{
    TextBox UserName = (TextBox)LoginControl.FindControl("UserName");
    if (UserName != null)
    {
        Label1.Text = UserName.Text;
    }
}
else
{
    Label1.Text = "Cannot find user name in Login control.";
}

Получение значений открытых свойств с исходной страницы

На целевой странице процесса межстраничной записи данных также можно получить значения открытых членов исходной страницы. В большинстве случаев на исходной странице определяются открытые свойства, значения которых необходимо получить на целевой странице.

ms178139.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Чтобы повысить безопасность, рекомендуется предоставлять в виде открытых свойств только необходимую информацию.

Для получения открытых членов исходной страницы сначала необходимо получить строго типизированную ссылку на саму страницу.

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

<%@ PreviousPageType VirtualPath="~/SourcePage.aspx" %> 

При включении этой директивы свойство PreviousPage является строго типизированным с использованием класса заданной исходной страницы. В этом случае можно непосредственно ссылаться на открытые члены исходной страницы. Тип исходной страницы можно объявить как прямо (с помощью атрибута type), так и косвенно, посредством явного указания ссылки на исходную страницу в атрибуте VirtualPath, как показано в примере.

В следующем примере показан фрагмент исходной страницы, содержащий открытое свойство CurrentCity, в котором предоставляется значение элемента управления TextBox с именем textCity.

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
ms178139.alert_note(ru-ru,VS.90).gifПримечание.

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

Если на целевой странице содержится директива PreviousPageType, указывающая на исходную, для обращения к свойству CurrentCity исходной страницы можно использовать код, аналогичный следующему.

Label1.Text = PreviousPage.CurrentCity;
Label1.Text = PreviousPage.CurrentCity;

Чтобы получить строго типизированную ссылку на исходную страницу, также можно включить на целевую страницу директиву @ Reference, которая содержит ссылку на исходную (аналогично ссылке на любой другой тип, которой необходимо использовать на странице). В этом случае можно получить свойство PreviousPage целевой страницы и привести его к типу исходной страницы, как показано в следующем примере.

Dim sourcePage As SourcePage_aspx
sourcePage = CType(PreviousPage, SourcePage_aspx)
Label1.Text = p.CurrentCity
SourcePage_aspx sourcePage;
sourcePage = (SourcePage_aspx) PreviousPage;
Label1.Text = sourcePage.CurrentCity;

Проверка обратной передачи на целевой странице

В процессе межстраничной записи данных содержимое элементов управления исходной страницы передается на целевую страницу, а в обозревателе выполняется операция HTTP POST (не операция GET). Непосредственно по завершении межстраничной записи данных свойству IsPostBack целевой страницы присваивается значение false. Несмотря на то что используется операция POST, в процессе межстраничной передачи данных не выполняется обратная передача на целевую страницу. Таким образом, свойству IsPostBack присваивается значение false и выполняется первичный код целевой страницы.

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

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If
if(PreviousPage != null)
{
    if(PreviousPage.IsCrossPagePostBack == true)
    {
         Label1.Text = "Cross-page post.";
    }
}
else
{
    Label1.Text = "Not a cross-page post.";
}

Обратите внимание, что если текущая страница не является целевой страницей процесса межстраничной передачи данных, в свойстве PreviousPage возвращается значение null (Nothing в Visual Basic).

Дополнительные сведения см. в разделе Практическое руководство. Определение способа вызова веб-страниц ASP.NET.

Сравнение межстраничной передачи данных и метода Server.Transfer

Свойство PreviousPage и директиву PreviousPageType рекомендуется применять для вызова целевой страницы в следующих двух случаях: выполнение межстраничной передачи данных (передача на основе клиента) и использование метода Transfer (серверная операция). В обоих случаях свойство PreviousPage используется для получения ссылки на исходную страницу на целевой странице.

На целевой странице может потребоваться определение способа вызова страницы: посредством межстраничной передачи данных или с помощью метода Server.Transfer. Для этого в классе Page предоставляется свойство IsCrossPagePostBack. Дополнительные сведения см. в разделе Практическое руководство. Определение способа вызова веб-страниц ASP.NET.

См. также

Задачи

Практическое руководство. Передача веб-страниц ASP.NET другой странице

Практическое руководство. Определение способа вызова веб-страниц ASP.NET