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