ASP .NET - Usando a postagem Cross-Page


Se você já desenvolveu uma aplicação para web com mais de uma página usando uma linguagem que gera conteúdo dinâmico como ASP, JSP, etc. , sabe que para passar valores entre as páginas pode usar as variáveis de sessão (Session) ou passar o valor concatenado na URL e capturá-lo usando o QueryString ou usar um formulário e capturar os valores na outra página com Request.Form. Chamamos isso de postagem Cross-Page.

O ASP .NET, a partir da versão 2.0 da plataforma .NET, permite que você poste o conteúdo de uma página para outra de uma maneira mais simples. A este recurso chamamos CrossPagePostBack.

Antes de mostrar o recurso CrossPagePostBack vamos relembrar alguns conceitos da programação ASP .NET.

Como funciona o modelo de programação ASP .NET ?

De forma bem resumida podemos dizer que funciona assim:

- Você efetua um pedido de uma página .aspx e o código da página é executado no servidor;
- A cada novo pedido a página chama-se a sim mesma (postback) de modo a executar o código novamente;
- A página sempre é executada no servidor e esta ação requer uma ida ao servidor (round-trip);
- No modelo desconectado do protocolo Http o navegador e o servidor estão conectados apenas durante o tempo necessário para processar o pedido feito pela sua requisição;
- O pedido de uma página faz com que no servidor seja criada uma nova instância da página;

Vejamos agora o ciclo de processamento da página conhecido como round-trip:

Agora voltando ao CrossPagePostBack vem a pergunta:

Como passar valores entre páginas ASP .NET sem usar sessão, ou queryString ou Request.Form ?

Qual é o truque ?

A partir do ASP .NET 2.0 o controle Button possui a propriedade PostBackUrl que obtém ou define a URL da página de destino para a qual os valores da página atual serão enviados.

Esta propriedade permite que você efetue um cross-page usando o controle Button. Se nada for informado nesta propriedade o valor padrão é uma string vazia (" ") que faz com que a página seja postada para ela mesma. (O modelo padrão ASP .NET).

Após definir a URL da propriedade PostBackUrl do controle Button da página de origem na página de destino você deve usar a propriedade PreviousPage do objeto Page : Page.PreviousPage que obtém a página que transferiu o controle para a página atual.

Em seguida você deve usar o método FindControl para pesquisar o contâiner atual para um controle de servidor especificando o parâmetro id que identifica o controle.

Abaixo temos uma figura que exemplifica o CrossPagePostPack:

- Na página de origem definimos a propriedade PostBackUrl do controle Button com a url da página de destino;
- Na página de destino usamos o método FindControl informando o id do controle(TextBox) do qual desejamos obter o valor;

Geralmente o código usado da página de destino deve verificar se existe a instância da página e deve realizar uma coersão forçada (Cast) para o tipo de controle do qual se esta obtendo o valor. Veja abaixo o exemplo

VB .NET

C#

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

A classe Page expõe a propriedade PreviousPage e se a página de destino e a página de origem estiverem na mesma aplicação ASP .NET, a propriedade PreviousPage na página de destino contém uma referência a página de destino. (Se as páginas estiverem em aplicações diferentes a propriedade PreviousPage não é inicializada). Por padrão a propriedade PreviousPage e do tipo Page.

Usando a referência na propriedade PreviousPage você pode procurar por controles na página de origem e extrair os valores desejados usando o método FIndControl.

Obs: Se o controle no qual você esta procurando um valor esta no interior de outr controle você deve primeiro obter uma referência para o container e então procurar no contair para achar o controle desejado. Veja abaixo um exemplo onde temos o controle TextBox identificado como UserName no interior de um controle Login:

     'primeiro crie uma instância do container Login
    Dim LoginControl As Login
    LoginControl = CType(PreviousPage.FindControl("Login1"), Login)
    'depois procure a partir da instância de Login o controle  
    Dim UserName As TextBox
    UserName = CType(LoginControl.FindControl("UserName"), TextBox)

Nota: Um forma mais fácil de tornar os valores de controles disponíveis para uma página de destino é expor os valores como propriedades públicas.

Além disso o CrossPagePostBack permite que a página de destino tenha a cesso a todos os valores públicos da página de origem. Exemplo:

1- Definindo a variável pública na página de origem Pagina1.aspx

VB .NET C#
Public ReadOnly Property Nome() As String 
Get 
       Return TextBox1.Text 
End Get 
End Property 
public String Nome
{
    get
    {
        return TextBox1.Text;               
    }
}

2- Obtendo o valor na página de destino Pagina2.aspx

Para poder obter os valores públicos da página de origem Pagina1.aspx devemos obter uma referência fortemente tipada da página de origem. Podemos conseguir isso incluindo uma diretiva na página de destino que permite especificar a página de origem:

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

Ao incluir esta diretiva , a propriedade PreviousPage é fortemente tipada para a classe da referência da página de destino e dessa forma você pode acessar diretamente os valores públicos das variavéis definidas na página de origem:

VB .NET

C#

Protected  Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Label1.Text = PreviousPage.Nome.ToString()
End Sub
protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = PreviousPage.Nome.ToString();
}

Durante um postback cross-page , o conteúdo dos controles da página de origem são postados para a página de destino, e o navegador executa um HTTP POST. Porém , na página de destino, a propriedade IsPostBack é definida como false imediatamente após o post cross-page. Embora tenha ocorrido um POST, a postagem cross-page não é um postback para a página de destino, por isso IsPostBack é definida como false e a página de destino pode executar o código pela primeira vez.

Você pode, se precisar, determinar se a página de destino esta rodando como resultado de um post cross-page. Para fazer isso você pode verificar a propriedade IsCrosspagePostBack da referência a página retornada pela propriedade PreviousPage da página de destino. Veja exemplo abaixo:

VB .NET C#
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.";
}

Vamos a um exemplo prático.

Abra o Visual Web Developer 2008 Express Edition e crie um novo web site no menu File -> New web site usando a linguagem Visual Basic e o modelo ASP .NET web site com o nome crossPage;

A seguir apague a página Default.aspx e clique com o botão direito do mouse sobre o nome do web site e selecione a opção Add New Item;

A seguir selecione o Template Web Form e informe o nome Cadastro.aspx

Repita o procedimento acima e inclua também uma página chamda Confirma.aspx. Ao final o seu web site deverá conter as duas páginas exibidas no Solution Explorer conforme figura abaixo:

O objetivo e passar valores da página Cadastro.aspx e para a página Confirma.aspx

Selecione a página Cadastro.aspx e a partir do menu Table -> Insert Table inclua uma tabela com 4 linhas e 2 colunas a seguir inclua a partir da ToolBox os seguintes controles:

conforme o leiaute abaixo:

No arquivo code-behind Cadastro.aspx.vb inclua o código abaixo:

Partial Class _Default
    Inherits System.Web.UI.Page

    Public ReadOnly Property Nome() As String
        Get
            Return txtNome.Text
        End Get
    End Property

    Public ReadOnly Property status() As String
        Get
            Return "cadastro"
        End Get
    End Property
End Class

Agora selecione a página Confirma.aspx e no modo Design inclua uma tabela com 6 linhas e 1 coluna a partir do Menu Table -> Insert Table;

A partir da ToolBox inclua os seguintes controles:

Conforme o leiaute abaixo:

Agora no arquivo code-behind Confirma.aspx.vb inclua o seguinte código:

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            If Not Page.PreviousPage Is Nothing Then
                Dim labelIdade As TextBox
                labelIdade = CType(PreviousPage.FindControl("txtIdade"), TextBox)
                If Not labelIdade Is Nothing Then
                    lblIdade.Text = labelIdade.Text
                End If

                Dim labelCargo As TextBox
                labelCargo = CType(PreviousPage.FindControl("txtCargo"), TextBox)
                If Not labelCargo Is Nothing Then
                    lblCargo.Text = labelCargo.Text
                End If

                lblNome.Text = PreviousPage.Nome.ToString()
                lblStatus.Text = PreviousPage.status.ToString()

            End If
        Catch ex As Exception
            lblmsg.Text = ex.Message.ToString()
        End Try
    End Sub

Agora abra o arquivo Confirma.aspx e no modo Source inclua a diretiva:

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

conforme a figura abaixo:

Antes de executar o web site clique sobre o formulário Cadastro.aspx com o botão direito do mouse e selecione a opção Set As Start Page;

Execute o seu web site pressionando F5 ou no menu Debug selecionando Start Debugging;

Será apresentado o formulário abaixo que após ser preenchido deve ser submetido clicando o botão Enviar:

Observe que o formulário para o qual definimos o envio(Confirma.aspx) é chamado e obtêm os valores das variáveis definidas no formulário de Cadastro:

Pegue o projeto completo aqui: crossPage.zip

Eu sei é apenas ASP .NET, mas eu gosto...

Referências:


José Carlos Macoratti