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 si 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 seja criada uma nova instância da página no servidor;
Vejamos agora o ciclo de
processamento da página conhecido como round-trip:
- O usuário solicita a página, via HTTP GET. A página é executada pela primeira vez;
- A “página” gera de forma dinâmica conteúdo HTML para o navegador;
- O usuário recebe a página e efetua a interação com a mesma submetendo novas informações através dos controles de formulário da página, clicando em um botão, um link etc.;
- A página é enviada novamente para o servidor web, via HTTP POST (o famoso postback);
- O servidor executa a página novamente e o ciclo se repete;
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 está obtendo o valor. Veja
abaixo o exemplo:
VB . NET
If Not Page.PreviousPage Is Nothing Then<br /> Dim SourceTextBox As TextBox<br /><strong>SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _<br /> TextBox)</strong><br /> If Not SourceTextBox Is Nothing Then<br /> Label1.Text = SourceTextBox.Text<br /> End If<br />End IfC#
if (Page.PreviousPage != null)<br />{<br /> TextBox SourceTextBox = <br /><strong> (TextBox)Page.PreviousPage.FindControl("TextBox1");</strong><br /> if (SourceTextBox != null)<br /> {<br /> Label1.Text = SourceTextBox.Text;<br /> }<br />}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 à 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 é 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ê está procurando
um valor está no interior de outro controle, você deve primeiro
obter uma referência para o contêiner 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<br /> Dim LoginControl As Login<br /> LoginControl = CType(PreviousPage.FindControl("Login1"), Login)<br /> 'depois procure a partir da instância de Login o controle <br /> Dim UserName As TextBox<br /> UserName = CType(LoginControl.FindControl("UserName"), TextBox)Nota: uma
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:
01. Definindo
a variável pública na página de origem Pagina1.aspx
VB .NET
Public ReadOnly Property Nome() As String <br />Get <br /> Return TextBox1.Text <br />End Get <br />End Property C#
public String Nome<br />{<br /> get<br /> {<br /> return TextBox1.Text; <br /> }<br />}02. 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
variáveis definidas na página de origem:
VB . NET
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)<br /> Label1.Text = PreviousPage.Nome.ToString()<br />End SubC#
protected void Page_Load(object sender, EventArgs e)<br />{<br /> Label1.Text = PreviousPage.Nome.ToString();<br />}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 está 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
If PreviousPage IsNot Nothing Then<br /><strong>If PreviousPage.IsCrossPagePostBack</strong> <strong>= True</strong> Then<br /> Label1.Text = "Cross-page post."<br /> End If<br />Else<br /> Label1.Text = "Not a cross-page post."<br />End IfC#
if(PreviousPage != null)<br />{<br /> if(<strong>PreviousPage.IsCrossPagePostBack == true</strong>)<br /> {<br /> Label1.Text = "Cross-page post.";<br /> }<br />}<br />else<br />{<br /> Label1.Text = "Not a cross-page post.";<br />}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 chamada Confirma.aspx. Ao final, o seu web site
deverá conter as duas páginas exibidas no Solution Explorer
conforme figura abaixo:

O objetivo é 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:
- 3 controles TextBox – ID’s
=> txtNome, txtIdade e txtCargo - 1 Button – ID=btnEnviar
Conforme o leiaute abaixo:

No arquivo code-behind Cadastro.aspx.vb inclua o código abaixo:
Partial Class _Default<br /> Inherits System.Web.UI.Page<br /><br /><strong>Public ReadOnly Property Nome() As String</strong><br /> Get<br /> Return txtNome.Text<br /> End Get<br /> End Property<br /><br /><strong> Public ReadOnly Property status() As String</strong><br /> Get<br /> Return "cadastro"<br /> End Get<br /> End Property<br />End ClassAgora 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:
- 4 Labels : ID’s = lblNome,
lblIdade, lblCargo, lblStatus - 1 Label : ID = lblmsg
- 1 Button : Text = Confirmar
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<br /> Try<br /> If Not Page.PreviousPage Is Nothing Then<br /> Dim labelIdade As TextBox<br /> labelIdade = CType(PreviousPage.FindControl("txtIdade"), TextBox)<br /> If Not labelIdade Is Nothing Then<br /> lblIdade.Text = labelIdade.Text<br /> End If<br /><br /> Dim labelCargo As TextBox<br /> labelCargo = CType(PreviousPage.FindControl("txtCargo"), TextBox)<br /> If Not labelCargo Is Nothing Then<br /> lblCargo.Text = labelCargo.Text<br /> End If<br /><br /> lblNome.Text = PreviousPage.Nome.ToString()<br /> lblStatus.Text = PreviousPage.status.ToString()<br /><br /> End If<br /> Catch ex As Exception<br /> lblmsg.Text = ex.Message.ToString()<br /> End Try<br /> End SubAgora 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…








