ASP .NET - Realizando a Postagem entre páginas


Este artigo trata em como efetuar a postagem entre páginas em aplicações ASP .NET usando os novos recursos disponíveis a partir da versão 2.0 da plataforma .NET.(a versão atual é a 4.0).

Por padrão os controles ASP .NET como Buttons, LinkButton, ImageButton, etc., que causam um postback em um página ASP .NET submetem a página de volta a si mesmos. Este é o comportamento padrão do ciclo de vida das páginas ASP .NET e é conhecido como PagePostBack.

Obs: Em ASP podíamos fazer isso usando variáveis de sessão , strings concatenadas via QueryString, e valores passados entre formulários obtidos via objeto Request.Form.

Voê pode querer realizar a postagem de uma página de onde você obteve informação e postar estes valores para outra página. As informações podem ter sido obtidas dos controles e/ou das propriedades da página de origem. Este procedimento é conhecido como CrossPagePostBack.

Neste cenário você pode postar o conteúdo dos controles e variáveis públicas de uma página para outra página definindo na propriedade PostBackUrl do controle Button, LinkButton,ImageButton, etc., a url da página de destino.

Para obter valores dos controles de uma página podemos usar a classe Page que expõe a propriedade PreviousPage; neste caso se a página origem e a página destino estiverem na mesma aplicação a propriedade PreviousPage irá conter uma referência a página a página origem, caso contrário a propriedade não será inicializada.

Para ilustrar bem esse comportamento vamos criar um novo web site usando o Visual Web Developer 2008 Express Edition, no menu selecione File -> New Web Site e a seguir selecione o template ASP .NET Web Site e informe o nome CrossPageApp e clique em OK;

Em seguida vamos renomear a página Default.aspx para Pagina1.aspx e incluir na página os seguintes controles:

definir na página o leiaute abaixo :

A seguir selecione o controle Button (ID=btnPagina1) e defina a sua propriedade PostBackUrl como sendo igual a :~/Pagina2.aspx.

Agora no menu WebSite selecione Add New Item e escolha o template WebForm, informe o nome Pagina2.aspx e clique em OK;

A seguir inclua um controle TextBox (ID = txtPagina2 ) conforme o leiaute abaixo:

Em seguida no evento Load da página Pagina2.aspx inclua o seguinte código:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim controleOrigem As TextBox = DirectCast(PreviousPage.FindControl("txtPagina1"), TextBox)
     if Not controleOrigem Is Nothing then
         txtPagina2.Text = controleOrigem.Text.ToString()
     End If

End Sub

A linha de código: PreviousPage.FindControl("txtPagina1")

usa a referência na propriedade PreviousPage estamos procurando o controle txtPagina1 na página origem e obtendo o seu valor usando o método FindControl.

O método FindControl retorna um controle da coleção Controls através da propriedade ID.

Apos verificarmos se obtivemos uma referência do controle exibimos o valor a sua propriedade Text no controle TextBox txtPagina2 da página Pagina2.aspx.

Antes de executar a aplicação clique com o botão direito sobre o webForm Pagina1.aspx e selecione : Set As Start Page.

Executando a aplicação iremos obter:

Se o controle que você esta procurando estiver no interior de outro controle (dentro de um template) você precisa primeiro obter uma referência ao container e então pesquisar o container para encontrar o controle que você deseja.

Obtendo valores públicos da página de origem

Podemos obter também na página de destino os valores dos membros públicos da página de origem. O cenário mais comum é aquele no qual a página de origem define propriedades públicas que você deseja obter na página de destino.

Para obter os valores de variáveis públicas na página de destino precisamos obter uma referência fortemente tipada para a página de origem.

Uma das formas de fazer isso é incluir a diretiva PreviousPageType na página de destino; ela permite especificar a página de origem. Para o nosso exemplo devemos incluir a diretiva na página Pagina2.aspx conforme abaixo:

A diretiva PreviousPageType :

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

Vamos incluir mais um controle TextBox na página de origem Pagina1.aspx e definir seu ID igual a txtNome e sua propriedade Text como igual a José Carlos Macoratti.

Agora vamos definir expor a propriedade Nome para obter o valor do texto inserido no controle TextBox definindo a propriedade Nome no arquivo code-behind da Pagina1.aspx:

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

Para obter o valor desta propriedade exibí-lo em um controle Label (ID=lblPagina2) na Pagina2.aspx basta definirmos o seguinte código:

lblPagina2.Text = PreviousPage.Nome.ToString()

Conforme a figura abaixo:

Executando o projeto o valor definido na caixa de texto txtNome e obtida pela propriedade Nome é exibida no controle Label, lblPagina2 da Pagina2.aspx.

Verificando por PostBacks na página de Destino

Durante um postback cross-page, o conteúdo dos controles da página origem são postados para a página destino e o navegador executa um HTTP POST (não um GET); Porém na página de destino a propreidade IsPostBack é definida imediatamente como false após a postagem cross-page.

Embora o comportamento seja de um POST, a postagem cross-page não é um postback para a página de destino, por isso a propriedade IsPostBack é definida como sendo false e a página de destino pode executar o seu código na primeira vez.

Dessa forma você pode determinar se a pagina destino esta rodando como resultado de uma postagem cross-page; para isso você pode verificar a propriedade IsCrossPagePostBack da referência da página retornada pela propriedade PreviousPage da página destino. Como exemplo inclua o código abaixo na página Pagina2.aspx:

     If PreviousPage IsNot Nothing Then
            If PreviousPage.IsCrossPagePostBack = True Then
                lblmsg.Text = "Postagem cross-page"
            Else
                lblmsg.Text = "Não é uma postagem cross-page"
            End If
        End If

Obs: Para testar lembre-se de incluir um controle Label com ID=lblmsg na Pagina2.aspx.

Executando a aplicação teremos:

A propriedade isCrossPagePostBack poderá ser usada na página origem para prevenir um processamento desnecessário quando a página estiver sendo re-carregada para a referência PreviousPage.

A propriedade PreviousPage e a diretiva PreviousPageType são úteis em duas situações onde você invoca uma página de destino:

Em ambas as operações o código na página destino pode obter uma referência a página origem usando a propriedade PreviousPage.

Podemos também realizar a verificação de valores válidos oriundos da página origem. Para isso a página de destino pode efetuar a validação através do método PreviousPage.IsValid para capturar submissões inválidas da página origem.

Os conceitos apresentados neste artigos são simples e básicos para um bom entendimento de sua aplicação ASP .NET.

Pegue o projeto completo aqui: CrossPageApp.zip

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

Referências:

José Carlos Macoratti