ASP.NET - Persistindo valores entre web forms


Embora os Web Forms tenham sido uma evolução que oferece um modelo de eventos onde o desenvolvedor pode facilmente trabalhar para construir sua aplicação Web. Nem tudo são flores.

Com ASP você podia passar valores de uma página para outra usando o método POST . Não dá para fazer a mesma coisa em ASP.NET.

É claro que existem formas de contornar a situação e neste artigo vou procurar mostrar algumas das possibilidades as quais são :

Usando variáveis de sessão:

A idéia aqui é armazenar valores para um web form(form1.aspx) em variáveis de sessão em ume acessá-las no outro web form(form2.aspx)

Você só deve ter o cuidado de não sobrecarregar  a sessão com muitas variáveis senão o servidor abre o bico...  Vejamos como se faz:

form1.aspx (C#) web form
private void Button1_Click
(object sender, System.EventArgs e)
{
	//textbox1 e textbox2 são controles do webform
	Session["nome"]=TextBox1.Text;
	Session["email"]=TextBox2.Text;

	 Response.Redirect("form2.aspx");
}

Ao clicar no botão de comando os valores dos controles TextBox são armazenados nas variáveis de sessão e repassadas para o formulário from2.aspx.

form2.aspx (C#) web form
private void Page_Load
(object sender, System.EventArgs e)
{
    TextBox1.Text=Session["nome"].ToString();
    TextBox2.Text=Session["email"].ToString();
    Session.Remove("nome");
    Session.Remove("email");
}

Ao ser carregado o web form form2.aspx obtém os valores das variáveis de sessão e as exibe nos TextBox ; depois remove os valores da sessão

Usando QueryString

Se você conhece ASP conhece também QueryString. Ele é muito usado para passar valores entre páginas ASP. A única desvantagem é que os valores passados serão visíveis no Navegador do usuário e você também não pode passar objetos usando QueryString. Ele é adequado para pequenos valores (o limite é uma string de 255 caracteres) que não necessitam de segurança. Para usá-lo fazemos assim :

form1.aspx (C#)

private void Button1_Click
(object sender, System.EventArgs e)
{
	string url;
	url="form2.aspx?nome=" + TextBox1.Text + "&email=" + TextBox2.Text;
	Response.Redirect(url);
}

 

No formulário form2.aspx receba os valores usando QueryString via objeto Request:

form2.aspx (C#)

private void Page_Load
(object sender, System.EventArgs e)
{
	TextBox1.Text=Request.QueryString["nome"];
	TextBox2.Text=Request.QueryString["email"];
}								

Usando Server.Transfer

A utilização do método Server.Transfer é um pouco mais complexo.  Nele você expõe os valores que deseja acessar em outra página como propriedade de uma classe. Por isto você terá que definir via código as propriedades na classe. É uma maneira mais elegante de passar valores.

Devemos definir duas propriedades : Nome e Email. em form1.aspx .

Vou usar agora código VB.NET.

Public ReadOnly Property Nome() As String
   Get
      Return TextBox1.Text
   End Get
End Property
Public ReadOnly Property EMail() As String
   Get
      Return TextBox2.Text
   End Get
End Property
 
Private Sub Button1_Click(sender As Object, e As System.EventArgs)
   Server.Transfer("form2.aspx")
End Sub 'Button1_Click
 

No formulário que vai receber os valores , form2.aspx fazemos :(VB.NET)

Private Sub Page_Load(sender As Object, e As System.EventArgs)

   'cria uma instância de formulário form1.aspx
   Dim wf1 As WebForm1 
   'obtem a referencia para manipular da instância atual
   wf1 = CType(Context.Handler, WebForm1)
   TextBox1.Text = wf1.Nome
   TextBox2.Text = wf1.EMail
End Sub 

Usando a classe HttpContext :

A classe encapsula todas as informações específicas sobre uma requisição HTTP. O objeto HttpContext da requisição HTTP atual fornece acesso aos objetos intrínsicos Request , Response e Server para a requisição.

Os valores armazenados em HttpContext são validos somente durante a duração de uma requisição. Veja o código abaixo:(VB.NET)

form1.aspx (VB.NET)

 Private Sub Button1_Click(sender As Object, e As System.EventArgs)

   Dim context As HttpContext = HttpContext.Current

   context.Items("Nome") = TextBox1.Text
   context.Items("Email") = TextBox2.Text

   Server.Transfer("form2.aspx")

End Sub

 

em form2.aspx - recebendo os valores e exibindo nos controles. Note que tenho que converter para String.

form2.aspx (VB.NET)

Private Sub Page_Load(sender As Object, e As System.EventArgs)

   Dim context As HttpContext = HttpContext.Current

    TextBox1.Text = CStr(context.Items("Nome"))
    TextBox2.Text = CStr(context.Items("Email"))

End Sub 

Faltou eu falar sobre ViewState ? Não ! dê uma olhada no artigo : ASP.NET - Criando seu primeiro Web Form - II.

Até mais ver ...


José Carlos Macoratti

1