Sulla Programmazione

Quattro chiacchere sulla programmazione e sulle bit-tecnologie con Fabrizio Cipriani

ASP.NET: eseguire chiamate javascript dopo il postback dell'UpdatePanel

Mi è capitato di dover eseguire del codice javascript dopo il postback dell'UpdatePanel, ed in particolare del codice javascript che fa uso di jQuery all'interno di un composite control, a sua volta inserito in un update panel.

La prima cosa che ho provato a fare è stata quella di inserire le linee javascript direttamente dentro l'evento RenderContents del composite control, ma ho realizzato subito che le linee javascript non vengono mai invocate, visto l'UpdatePanel ricarica il proprio contenuto dinamicamente con chiamata Ajax.

Aggiungere il codice javascript usando il metodo RegisterStartupScript ha migliorato un pò la situazione:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
String csname = "UpdatePanelScript";
Type cstype = this.GetType();

ClientScriptManager cs = Page.ClientScript;

StringBuilder sb = new StringBuilder("alert('Codice javascript eseguito!');");

if (!cs.IsStartupScriptRegistered(cstype, csname))
{
  cs.RegisterStartupScript(cstype, csname, sb.ToString(), true);
}

In questo modo, posso visualizzare il mio originalissimo alert() Javascript al termine del caricamento della pagina, che include il caricamento dei dati visualizzati nell'UpdatePanel.

Quello di cui avevo bisogno però, era eseguire operazioni su oggetti che cambiano stato e visibilità attraverso i vari postback dell'UpdatePanel. Quello che mi serviva era quindi qualcosa che invocasse il mio codice javascript ogni volta che l'UpdatePanel veniva aggiornato.

Fortunatamente esiste la classe javascript PageRequestManager, la quale permette di definire delle funzioni da invocare all'inizio o alla fine di ogni aggiornamento dell'UpdatePanel.

Il risultato finale è questo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
String csname = "UpdatePanelScript";
Type cstype = this.GetType();

ClientScriptManager cs = Page.ClientScript;

StringBuilder sb = new StringBuilder(@"
  var prm = Sys.WebForms.PageRequestManager.getInstance();
  prm.add_endRequest(EndRequestHandler);

  function EndRequestHandler(sender, args)
  {
    alert('Updatepanel ha eseguito un aggiornamento');
  }
");

if (!cs.IsStartupScriptRegistered(cstype, csname))
{
  cs.RegisterStartupScript(cstype, csname, sb.ToString(), true);
}

Comments