Desenvolvimento - ASP. NET

Cross Page PostBack no ASP.NET 2.0 - Passando parâmetros entre WebForms com PostBackURL

Neste artigo, vamos conhecer um novo recurso do ASP.NET 2.0 que introduz uma forma eficiente e prática para implementação do CrossPage Posting.

por Carlos de Mattos



Tecnologias:

  • C#
  • ASP.NET 2.0

    MSDN Library:

    http://msdn2.microsoft.com/en-us/library/ms178139.aspx
    http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.button.postbackurl.aspx
    http://msdn2.microsoft.com/en-us/library/system.web.ui.postbackoptions.actionurl.aspx

    Introdução

    A necessidade de passar parâmetros entre páginas é comum para todos os desenvolvedores de soluções Web. Desde o ASP tradicional esta funcionalidade podia ser implementada de diversas formas. As mais comuns faziam uso de variáveis de sessão, strings concatenadas nas URLs que eram capturadas através do método QueryString e valores passados através de formulários de diálogo que eram capturados através do objeto Request.Form. Neste artigo, vamos conhecer um novo recurso do ASP.NET 2.0 que introduz uma forma eficiente e prática para implementação do CrossPage Posting.

    Entendendo o PostBack

    O funcionamento padrão do ASP.NET permite que controles como botões possam remeter o conteúdo de uma página para ela mesma. Neste ciclo, o desenvolvedor pode obter os valores inseridos pelo usuário nos controles da página e processar as informações desejadas na própria página. Este processo é conhecido como PagePostBack. Esse recurso é muito utilizado, porém, você poderá encontrar diversas situações onde terá a necessidade de postar o conteúdo de uma página para outra, é aí que o CrossPagePostBack entra em cena.

    O CrossPagePostBack

    No ASP.NET 2.0 o desenvolvedor pode postar o conteúdo dos controles e variáveis públicas de uma página para outra informando na propriedade PostBackUrl de um controle Button o nome da página de destino. É possível construir uma página com vários botões e cada um indicando uma página diferente para efetuar o CrossPagePostBack. Quando a página de origem é executada e o usuário clica no botão de comando, o ASP.NET Runtime invoca a página de destino e disponibiliza o conteúdo da página de origem através do objeto PreviousPage. Veja a ilustração apresentada na Figura 1.


    Figura 1: O CrossPagePostBack

    O formulário Page1.aspx

    A implementação da página Page1.aspx, neste exemplo, não requer nenhuma linha de código. Vamos nos limitar a adicionar uma caixa de texto para entrada de dados do usuário e um botão de comando cuja propriedade PostBackUrl será definida como Page2.aspx. A Figura 2 mostra a janela de propriedades do botão Button1.


    Figura 2: A propriedade PostBackUrl

    O formulário Page2.aspx

    A página de destino do nosso exemplo de CrossPagePostBack, neste exemplo, terá apenas um texto informativo e um controle do tipo Label para receber o texto da página de origem. O Quadro 1 mostra o código do evento Load do formulário Page2.aspx que obtém a informação da página de origem. Observe que uma nova instância do controle do tipo TextBox é criada e carregada com o controle da página de origem.

    protected void Page_Load(object sender, EventArgs e)
    {
        TextBox t = (TextBox)PreviousPage.FindControl("TextBox1");
        Label1.Text = t.Text.ToString();
    }
    Quadro 1: Obtendo dados do CrossPagePost
    

    As Figuras 3 e 4 apresentam os formulários Page1.aspx e Page2.aspx respectivamente em tempo de execução.


    Figura 3: O formulário Page1.aspx em tempo de execução


    Figura 4: O formulário Page2.aspx em tempo de execução

    A propriedade IsCrossPagePostBack

    Assim como a classe Page possui uma propriedade boleana IsPostBack, a classe PreviousPage também apresenta uma propriedade IsCrossPagePostBack que pode ser testada para definir o fluxo do programa. Observe o código apresentado no Quadro 2.

    if(PreviousPage != null) { 
    	if(PreviousPage.IsCrossPagePostBack == true) { 
    		Label1.Text = "Cross-page post."; 
    	} 
    } 
    else { 
    	Label1.Text = "Not a cross-page post."; 
    } 
    Quadro 2: Testando a propriedade IsCrossPagePostBack
    

    Obtendo valores públicos através do CrossPostBack

    Da mesma forma como no exemplo anterior, quando obtivemos acesso às propriedades da Caixa de Texto, o mecanismo do CrossPagePostBack permite que a página de destino possa acessar todos os valores públicos da página de origem. Para ilustrar essa funcionalidade, vamos acrestar uma propriedade pública em nosso formulário Page1.aspx. Veja o código no Quadro 3.

    public String CrossText
    {
        get
        {
            return TextBox1.Text;
        }
    }
    Quadro 3: Propriedade Pública CrossText
    
    Agora para obter acesso aos valores públicos da página de origem o desenvolvedor deverá inserir uma diretiva na página de destino como apresentado no Quadro 4.
    <%@ PreviousPageType VirtualPath="~/Page1.aspx" %> 
    Quadro 4: A Diretiva PreviousPageType
    
    Com esta diretiva de página, o desenvolvedor poderá acessar todos os valores públicos da página de origem de forma simples e prática. Veja o código do evento Load do formulário Page2.aspx apresentado no Quadro 5.
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = PreviousPage.CrossText.ToString();
    }
    Quadro 5: Acessando a propriedade pública com CrossPagePostBack
    

    CrossPagePostBack com MasterPages

    Uma dúvida comum ocorre quando usamos o CrossPagePostBack com MasterPages. Quando o desenvolvedor tenta utilizar o método FindControl em cenários criados com MasterPages, ele não obterá o resultado desejado. É importante esclarecer que se o controle desejado estiver contido por outro controle do tipo Container, o método FindControl não conseguirá localizá-lo. Neste caso, é preciso em primeiro lugar localizar o controle do tipo Container e depois invocar o método FindControl novamente para localizar o controle desejado. O objeto PreviousPage expõe o objeto Master que deve ser utilizado sempre que for necessário localizar um controle contido na MasterPage. O Quadro 6 apresenta o fragmento de código onde uma página resgata valores inseridos em controles contidos por um controle do tipo ContentPlaceHolder de uma MasterPage. Observe a utilização do método FindControl.

    protected void GetCrossValues()
    {
    
    . . .
    
    ContentPlaceHolder c = (ContentPlaceHolder)PreviousPage.Master.FindControl("mainCopy");
    TextBox t = (TextBox)c.FindControl("txtCashDate");
    DropDownList d = (DropDownList)c.FindControl("cboOffices");
    
    cmd.Parameters.Add("@CashDate", SqlDbType.SmallDateTime).Value = t.Text.ToString();
    cmd.Parameters.Add("@OfficeID", SqlDbType.Int).Value = d.SelectedValue.ToString();
    
    . . .
    
    } 
    Quadro 6: CrossPagePostBack em MasterPages
    

    Conclusão

    Neste artigo demonstrei de forma prática como utilizarmos o recurso de CrossPagePostBack do ASP.NET 2.0. O desenvolvedor acompanhou os passos necessários para obter valores inseridos em controles e valores públicos através desse novo mecanismo. Também demonstramos como utilizar o CrossPagePostBack em páginas contidas por MasterPages.

  • Carlos de Mattos

    Carlos de Mattos - É profissional certificado pela Microsoft desde 1998. Atua como desenvolvedor de soluções customizadas para o mercado corporativo há mais de 10 anos. Foi premiado pela Microsoft como MVP em 2003 e 2004. Tem diversos artigos publicados nas revistas FórumAccess e MSDN Magazine, nos Websites MSDN Online Brasil, Portal DevMedia/MSDN e Linha de Código. Carlos também atuou durante 5 anos junto à Comunidade Acadêmica na região de Sorocaba/SP ministrando palestras e treinamentos junto às Universidades e Colégios Técnicos. Atualmente está em Sorocaba/SP, na WD5 Solutions dedicando-se à implementação de soluções baseadas em tecnologia Microsoft.NET.