quinta-feira, outubro 23, 2008

Ciclo de eventos no ASPX

Uma das coisas mais chatas no ciclo de eventos, é o evento de click de um botão acontecer só depois do OnLoad. Então que fazer quando no OnLoad precisamos de saber se um botão foi pressionado? O truque para conseguir esta informação no OnLoad é ter um hidden field que é afectado pelo evento de client click do botão.

Código no ASPX:
<asp:button id="filter" onclientclick="JSFilter()" onclick="Filter" runat="server">

Código no code behind:
protected override void OnInit(EventArgs e)
{
   Page.ClientScript.RegisterHiddenField("filterChange", "");
}
protected override void OnLoad(EventArgs e)
{
   base.OnLoad(e);

   string arg = HttpContext.Current.Request.Form["filterChange"];
   if (arg == "1")
   {
       //A lógica que se quiser se o botão foi pressionado
   }
}

Código de Javascript:
function JSFilter(){
  var hidden = $('filterChange');
  hidden.value = 1;
}
Quando o botão é pressionado o javascript é executado colocando o valor do hidden field igual a 1 (estou a usar mootools no javascript, mas poderia usar um get por id, sem usar o mootools). Quando entro no evento OnLoad verifico se o valor do hidden field é 1, se for é porque o botão foi pressionado.

2 comentários:

Anónimo disse...

Se o botão for clicado, no postback o HttpContext.Current.Request.Form["filter"] contém o valor Text do botão.

Desta forma escusas de fazer o hack em javascript :)

Tiago Sousa disse...

Boa, pensava que ele vinha sempre, é um pequeno detalhe mas importante.
Obrigado :)