Compartilhar via


Postagem entre Páginas em Páginas da Web do ASP.NET

Por padrão, botões e outros controles que causam uma nova postagem em um página da Web do ASP.NET enviam a página novamente para si mesmo.Isso é parte do ciclo de processamento que páginas da Web do ASP.NET passam como parte do seu processamento normal.Para obter detalhes, consulte:Introdução a páginas da Web do ASP.NET.

Em algumas circunstâncias, você pode desejar postar uma página para outra página.Por exemplo, você pode estar criando um formulário de várias páginas que coleta informações diferentes em cada página.Nesse caso, você pode configurar certos controles (aqueles que implementam a interface IButtonControl, como o controle Button) na página para postar em uma página de destino diferente.Isso é chamado de postagem entre páginas.Postagem entre páginas fornece algumas vantagens sobre o uso do método Transfer para redirecionar a outra página.Para obter detalhes, consulte:Redirecionando Usuários para Outra Página.

Observação:

Você também pode usar o controle Wizard para criar formulários de exibição múltipla.Para obter detalhes, consulte:Visão Geral Sobre Controle de Servidor Web do Wizard.

Como a postagem entre páginas está configurada para controles individuais, você pode criar uma página que posta páginas diferentes dependendo de qual botão o usuário clica.

Obtendo Informações da Página de Origem

Quando você configura uma página para postagem entre páginas, você frequentemente deseja obter informações na página de origem.Isso pode incluir as informações de controles na página — ou seja, as informações sendo postadas por navegador — assim como propriedades públicas da página de origem.

Obtendo Valores de Controle

A classe Page expõe uma propriedade chamada PreviousPage.Se a página de destino e a página de origem estiverem no mesmo aplicativo ASP.NET, a propriedade PreviousPage na página de destino contém uma referência para a página de origem.(Se a página não é o destino de uma postagem entre páginas, ou se as páginas estão em diferentes aplicativos, a propriedade PreviousPage não é inicializada.) Por padrão, a propriedade PreviousPage é tipada como Page.

Observação:

Se as páginas de origem e destino estiverem em diferentes aplicativos, você não é pode obter os valores dos controles na página diretamente, mas você pode ler os dados lançados do dicionário Form.Você não pode ler estado de exibição da página fonte, porque ele é hashed.Se você quiser armazenar valores na página de origem e torná-los disponíveis em uma página de destino em outro aplicativo, você pode armazenar os valores como sequências de caracteres dentro de campos ocultos na página de origem e acessá-los por Request.Form na página de destino.

Usando a referência na propriedade PreviousPage, você pode procurar por controles na página de origem e extrair os valores.Você normalmente faz isso com o método FindControl.

Observação:

Se você está codificando a página de origem especificamente para que possa compartilhar informações com páginas de destino, uma maneira mais fácil para tornar valores de controle disponíveis para a página de destino é expô-las como propriedades públicas.Para obter detalhes, consulte Getting Public Property Values from the Source Page posteriormente neste tópico.

O exemplo de código a seguir mostra como é possível obter o valor do controle TextBox1 na página original.

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;
    }
}

O método FindControl localiza controles no contêiner de nomeação atual.Se o controle que você está procurando está dentro de outro controle (normalmente, dentro um modelo), deve primeiro obter um contêiner para o recipiente e, então, procurar o contêiner para localizar o controle que você deseja obter.No exemplo de código a seguir, a página de origem contém um controle Login com um recipiente LayoutTemplate que, por sua vez, contém um controle TextBox chamado UserName.O código obtém o valor do controle 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.";
}

Obtendo Valores de Propriedades Públicas da Página de Origem

Na página de destino de uma postagem entre páginas, você também pode obter os valores de membros públicos da página de origem.A situação mais comum é que a página de origem define propriedades públicas e você deseja obter seus valores na página de destino.

Observação de segurança:

É recomendável que você exponha somente as informações necessárias como propriedades públicas para reduzir a quantidade de informações disponíveis aos usuários potencialmente prejudiciais.

Para obter membros públicos da página de origem, você deve primeiro obter uma referência altamente digitada para a página de origem.

Você pode fazer isso de inúmeras formas.A primeira é incluir uma diretiva @ PreviousPageType na página de destino, que permite que você especifique a página de origem, como no exemplo:

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

Quando essa diretiva for incluída, a propriedade PreviousPage é fortemente tipada para a classe de referência da página de origem.Como uma consequência, você pode consultar membros públicos da página de origem diretamente.Você pode especificar o tipo da página de origem diretamente, usando um atributo type, ou indiretamente pela referência explicita à página fonte em um atributo VirtualPath, como mostrado no exemplo.

O exemplo de código a seguir mostra uma parte de uma página de origem contendo uma propriedade pública denominada CurrentCity que expõe o valor de um controle TextBox chamado textCity.

Public ReadOnly Property CurrentCity() As String
    Get
        Return textCity.Text
    End Get
End Property
public String CurrentCity
{
    get
    {
        return textCity.Text;
    }
}
Observação:

As propriedades da página de origem que são criadas principalmente para expor valores para postagem entre páginas são geralmente propriedades somente-leitura.Embora a página de origem possa conter propriedades públicas de leitura / gravação, definir uma propriedade da página de origem para a propriedade da página de destino geralmente não tem finalidade, porque o valor não será persistente.

Se a página de destino contiver uma diretiva PreviousPageType que aponta para a página de origem, você pode acessar a propriedade CurrentCity da página de origem, usando o código como o seguinte.

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

Outra maneira para obter uma referência para a página de origem digitada é incluir uma diretiva @ Referência na página de destino que faz referência a página de origem, como você faria referência a qualquer tipo que você desejasse usar na sua página.Nesse caso, na página de destino é possível obter a propriedade PreviousPage da página de destino e convertê-lo para o tipo de página de origem, como no exemplo de código a seguir.

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;

Verificando Postbacks na Página de Destino

Durante uma nova postagem entre páginas, o conteúdo dos controles da página de origem é enviado para a página de destino e o navegador executa uma operação HTTP POST (não uma operação GET).No entanto, na página de destino, a propriedade IsPostBack é false imediatamente após uma postagem entre páginas.Embora o comportamento seja aquele de um POST, a postagem cruzada não é um postback para a página de destino.Portanto, IsPostBack é definida como false e a página de destino pode passar por seu código pela primeira vez.

Se isto é útil em seu aplicativo, você pode determinar se a página de destino está sendo executada como resultado de uma postagem página cruzada.Para fazer isso, você pode testar a propriedade IsCrossPagePostBack da referência de página retornada pela propriedade PreviousPage da página de destino, como no exemplo de código a seguir.

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.";
}

Observe que se a página atual não é o destino de uma postagem entre páginas, a propriedade PreviousPage retornará null (Nothing no Visual Basic).

Para obter mais informações, consulte Como: Determinar como foram invocadas páginas da Web do ASP.NET.

Postagem entre Páginas Cruzadas Versus Transferência de Servidor

The PreviousPage propriedade e o PreviousPageType diretiva são úteis em duas situações onde você chama a página de destino: em uma nova postagem entre páginas, que é uma transferência baseada no cliente, com o Transfer método, que é uma operação baseada em servidor. Em ambas as operações, código na página de destino pode obter uma referência para a página de origem usando a propriedade PreviousPage.

Isso pode ser importante na página de destino para determinar se a página foi chamada a partir de uma postagem entre páginas ou uma operação Server.Transfer.Para ajudá-lo fazer isso, a classe Page expõe uma propriedade chamada IsCrossPagePostBack.Para obter detalhes, consulte:Como: Determinar como foram invocadas páginas da Web do ASP.NET.

Consulte também

Tarefas

Como: Postar páginas da Web do ASP.NET para uma página diferente

Como: Determinar como foram invocadas páginas da Web do ASP.NET