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
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 CrossTextAgora 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 PreviousPageTypeCom 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.