Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mário Monteiro

ASP .NET - Usando a postagem Cross-Page

Recommended Posts

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

 

Imagem Postada

 

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 If

C#

 

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 Sub

C#

 

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 If

C#

 

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 chamada Confirma.aspx. Ao final, o seu web site deverá conter as duas páginas exibidas no Solution Explorer conforme figura abaixo:

 

Imagem Postada

 

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:

 

Imagem Postada

 

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:

 

* 4 Labels : ID's = lblNome, lblIdade, lblCargo, lblStatus

* 1 Label : ID = lblmsg

* 1 Button : Text = Confirmar

 

Conforme o leiaute abaixo:

 

Imagem Postada

 

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:

 

Imagem Postada

 

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:

 

Imagem Postada

 

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:

 

Imagem Postada

 

Pegue o projeto completo aqui: crossPage.zip

 

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

 

Fonte: Artigo iMasters

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.