venerdì 20 aprile 2007

Creare un web custom control - Parte 6

Eventi

Per completare il controllo è necessario dotarlo della capacità, in corrispondenza del click su una voce di menu, di generare un evento lato client che scateni l'esecuzione di codice lato server.

La sequenza di operazioni che porta al raise di un evento all'interno dell'architettura ASP.NET è la seguente:
  1. javascript, in genere in risposta ad un evento DHTML, invoca la funzione __doPostBack con due argomenti: eventTarget con il nome del controllo che ha generato l'evento e eventArgument come variabile dove inserire dei parametri aggiuntivi.
  2. a questo punto l'esecuzione del comando è presa in carico dalle librerie javascript di ASP.NET che provvedono a passare i dati al server tramite un normale postback con ricaricamento della pagina in un tradizionale progetto ASP.NET o tramite la classe XMLHttpRequest nei progetti che ricorrono ad Ajax.
  3. il server elabora la richiesta eseguendo il codice necessario compreso il codice corrispondente all'evento e risponde al client rinviando i dati in formato XML oppure HTML a seconda che si stia lavorando in Ajax o meno.
  4. In un progetto Ajax è ancora la libreria ASP.NET client ad elaborare la risposta e ad aggiornare l'aspetto della pagina, in un progetto tradizionale è il browser che esegue il rendering della pagina.
Nel nostro progetto la funzione javascript che si occupa di eseguire un __doPostBack è YVChgBkgMnu come è possibile verificare nella libreria js riportata nel secondo articolo dove si può notare che come secondo argomento della funzione è passato l'indice (0 ... n-1) della voce di menu cliccata.

Decidiamo di chiamare il nostro evento con il nome di MenuChangeHandler, nel codice C# è necessario quindi dichiararlo:

public delegate void MenuChangeHandler(object sender, int e);

All'interno della classe dichiariamo il delegate MenuChange:

public event MenuChangeHandler MenuChange;

E inseriamo il codice di risposta all'evento:

public void RaisePostBackEvent(string
{
   if (MenuChange != null)
      MenuChange(this, Convert.ToInt16(eventArgument));
}

La nostra nuova classe Menu.cs può essere visualizzata cliccando qui.

Nessun commento: