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:
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:

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
Dim SourceTextBox As TextBox
SourceTextBox = CType(PreviousPage.FindControl("TextBox1"), _
TextBox)
If Not SourceTextBox Is Nothing Then
Label1.Text = SourceTextBox.Text
End If
End IfC#
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 à 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
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: 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
Get
Return TextBox1.Text
End Get
End Property C#
public String Nome
{
get
{
return TextBox1.Text;
}
}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)
Label1.Text = PreviousPage.Nome.ToString()
End SubC#
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 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
If PreviousPage.IsCrossPagePostBack = True Then
Label1.Text = "Cross-page post."
End If
Else
Label1.Text = "Not a cross-page post."
End IfC#
if(PreviousPage != null)
{
if(PreviousPage.IsCrossPagePostBack == true)
{
Label1.Text = "Cross-page post.";
}
}
else
{
Label1.Text = "Not a cross-page post.";
}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:
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 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:
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 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...
Aderlan Rodrigues de Melo
Olá Macoratti, como sempre, excelente artigo.
Será que você poderia me dizer qual das opções é a mais recomendada?
Segurança, desenpenho e etc.
Essa forma parece bem interessante, mas em um sistema grande, é recomendado?
Obrigado, até mais...
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.