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

Visual Studio 2010

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

Если в приложении выполняется перенаправление (переход) с одной веб-страницы ASP.NET на другую, часто возникает необходимость передать данные исходной страницы на страницу назначения. Например, может быть страница, на которой пользователи могут выбирать элементы для покупки. Когда пользователь выполняет отправку страницы, может понадобиться вызвать другую страницу, с помощью которой могут быть обработаны сведения, которые введены пользователем.

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

  • Используйте строку запроса, данные из которой добавляются к URL-адресу целевой страницы. Например, можно использовать строку запроса при использовании элемента управления HyperLink, чтобы встроить навигацию в страницу или при программном перенаправлении на другую страницу с помощью метода Redirect.

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

    6c3yckfw.alert_note(ru-ru,VS.100).gifПримечание.

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

  • Используйте состояние сеанса, чтобы сохранять сведения, которые стали доступными для всех веб-страниц ASP.NET в текущем приложении. Однако при этом сведения сохраняются в памяти сервера до окончания сеанса, что неэффективно с точки зрения использования системных ресурсов, даже по сравнению с простой передачей сведений на следующую страницу. Дополнительные сведения см. в разделе Общие сведения об управлении состоянием ASP.NET.

  • На целевой странице считайте значения элементов управления и значения открытых свойств прямо с исходной страницы. Эта стратегия работает в двух ситуациях: когда для исходной и целевой страницы имеет место взаимный обмен сведениями (дополнительные сведения см. в разделе Практическое руководство. Передача веб-страниц ASP.NET другой странице), а также когда для передачи выполнения из исходной страницы на целевую страницу сервера вызывается метод Transfer. Стратегия считывания значений прямо с исходной страницы описана в данном разделе.

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

6c3yckfw.alert_note(ru-ru,VS.100).gifПримечание.

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

Возвращение значений открытых свойств с исходной страницы

  1. На исходной странице создайте один или более открытых свойств.

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

    Public ReadOnly Property CurrentCity() As String
        Get
            Return textCity.Text
        End Get
    End Property
    

    public String CurrentCity
    {
        get
        {
            return textCity.Text;
        }
    }
    
    6c3yckfw.alert_note(ru-ru,VS.100).gifПримечание.

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

  2. На целевой странице добавьте директиву страницы @ PreviousPageType, которая указывает на исходную страницу.

    В следующем примере кода показана директива PreviousPageType, которая ссылается на исходную страницу с именем SourcePage.aspx.

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

    Директива PreviousPageType является причиной того, что тип свойства PreviousPage относится к классу исходной страницы.

  3. В коде целевой страницы используйте строго определенные члены свойства PreviousPage, чтобы считать свойства исходного кода.

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

    Label1.Text = PreviousPage.CurrentCity
    

    Label1.Text = PreviousPage.CurrentCity;
    

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

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

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

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

    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;
        }
    }
    
    6c3yckfw.alert_note(ru-ru,VS.100).gifПримечание.

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

Если исходная и целевая страницы не являются страницами одного веб-приложения, можно считывать переданные значения исходной страницы на целевой странице. Эта методика также эффективна, если целевая страница является страницей ASP.NET, однако исходная страница таковой не является. Обратите внимание, что можно возвратить только отправленные значения; невозможно считать значения произвольных элементов управления на странице.

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

  • В целевой странице считайте коллекцию Form, которая возвращает словарь пар имя/значение, по одной паре на каждое переданное значение.

    В следующем примере кода показан идентификатор и значение каждого переданного на исходную страницу и отображены переданные значения на метке с именем Label1.

    6c3yckfw.alert_note(ru-ru,VS.100).gifПримечание.

    Оправленные сведения из страниц ASP.NET включают значения скрытых полей, таких как __VIEWSTATE, __EVENTTARGET и __EVENTARGUMENT, которые используются для внутренней обработки на странице. В следующем примере кода исключаются значения переданных полей, которые имеют имя, начинающееся с двойного подчеркивания (__).

    Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
            Handles Me.Load
        Dim displayValues As New StringBuilder()
        Dim postedValues As NameValueCollection = Request.Form
        Dim nextKey As String
        For i As Integer = 0 To postedValues.AllKeys.Length - 1
            nextKey = postedValues.AllKeys(i)
            If nextKey.Substring(0, 2) <> "__" Then
                displayValues.Append("<br>")
                displayValues.Append(nextKey)
                displayValues.Append(" = ")
                displayValues.Append(postedValues(i))
            End If
        Next
        Label1.Text = displayValues.ToString()
    End Sub
    

    void Page_Load(object sender, EventArgs e)
    {
        System.Text.StringBuilder displayValues = 
            new System.Text.StringBuilder();
        System.Collections.Specialized.NameValueCollection 
            postedValues = Request.Form;
        String nextKey;
        for(int i = 0; i < postedValues.AllKeys.Length - 1; i++)
        {
            nextKey = postedValues.AllKeys[i];
            if(nextKey.Substring(0, 2) != "__")
            {
                displayValues.Append("<br>");
                displayValues.Append(nextKey);
                displayValues.Append(" = ");
                displayValues.Append(postedValues[i]);
            }
        }
       Label1.Text = displayValues.ToString();
    }
    
Показ: