Realizzare un controllo custom in ASP.NET AJAX - Seconda parte

4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>

Ecco dunque come potrebbe apparire nella sua interezza il codice JavaScript di inizializzazione di un controllo TabViewContainer:

Sys.Application.add_init(function() {
  $create(Cobisi.TabViewContainer, { tabShowTimeout: 200 }, { tabChanged: onTabChanged }, null, $get("Test"));
});
Sys.Application.initialize();

Figura 5

Figura 5 - Funzionamento del controllo

Come è possibile vedere in figura 5, il comportamento è quello atteso ed il controllo funziona egregiamente senza l'ausilio di alcuna componente lato server. Naturalmente, la controparte server di ASP.NET AJAX si occupa tra l'altro di gestire in maniera trasparente ed autonoma l'attività di inizializzazione dei componenti.

Il modello server

Nonostante il codice sia quindi a tutti gli effetti già autonomo e non necessiti di una controparte server, risulta quasi sempre necessario corredare controlli di questo tipo con classi sviluppate in codice managed, che facciano da tramite tra client e server. Nonostante la vera innovazione portata da ASP.NET AJAX risieda nella libreria client, le estensioni server hanno un ruolo di primo piano nell'integrazione del proprio codice con questo framework.

Al di là dei classici requisiti imposti a chi sviluppa controlli ASP.NET, creare la controparte server di un controllo per ASP.NET AJAX richiede unicamente la stesura di una classe che implementa l'interfaccia IScriptControl del namespace System.Web.UI, (oppure l'interfaccia IBehaviorControl nel caso dei behavior), definita nell'assembly System.Web.Extensions. Questa interfaccia obbliga l'implementatore a definire gli eventuali script esterni necessari al funzionamento del componente ed i valori dei parametri della funzione $create(), richiamata all'atto dell'inizializzazione dello stesso.

Le finalità del modello server di ASP.NET AJAX sono dunque concentrate sulla capacità di rendering degli script necessari all'inizializzazione del modello client e dei componenti che di volta in volta fanno parte di quest'ultimo.

Implementazione del controllo lato server

Come accennato, il framework richiede ad ogni controllo di implementare l'interfaccia IScriptControl, rendendo in tale maniera disponibili alcune informazioni necessarie al suo funzionamento. Pertanto è possibile - e questo è l'approccio seguito durante la fase di progettazione di TabViewContainer - creare la propria classe di controllo in maniera tale che derivi da Control (o una sua derivata), tipo da cui notoriamente tutti i controlli ASP.NET derivano, ed implementare l'interfaccia suddetta.

La definizione di IScriptControl è estremamente semplice:

public interface IScriptControl
{
  IEnumerable GetScriptDescriptors();
  IEnumerable GetScriptReferences();
}

Come si può notare, gli sviluppatori devono fornire in sostanza zero o più descrittori di inizializzazione (ScriptDescriptor del namespace System.Web.UI) e zero o più riferimenti a script esterni (ScriptReference).

Descrivere il controllo

Così come esiste una gerarchia del modello a componenti, esiste anche una gerarchia di classi di descrittori, dove ogni classe è specifica della tipologia di componente che descrive. Come è facile intuire, ScriptDescriptor sta alla base di tale gerarchia, ma da essa deriva ScriptComponentDescriptor e da quest'ultima ScriptBehaviorDescriptor e ScriptControlDescriptor. Poichè, nel caso esposto in questo articolo, l'oggetto in esame è un controllo, la scelta cade intuitivamente su ScriptControlDescriptor: tale descrittore consente di definire i dettagli relativi all'associazione dell'elemento DOM alla classe di controllo da istanziare lato client, nonchè ai valori delle proprietà e dei gestori di evento di quest'ultimo.

Stando alle attuali necessità di TabViewContainer, l'implementazione del primo metodo di IScriptControl può essere ridotta a questo semplice blocco:

public IEnumerable GetScriptDescriptors()
{
  yield return new ScriptControlDescriptor("Cobisi.TabViewContainer", ClientID);
}

Tuttavia, nel caso in cui si desideri impostare valori di proprietà o gestori di evento client è necessario operare ulteriormente nell'ambito della classe ScriptControlDescriptor. I due metodi AddProperty() e AddEvent() consentono infatti di aggiungere al descrittore del controllo rispettivamente proprietà e gestori di evento esposti dal controllo stesso.

Volendo inizializzare l'evento tabChanged e la proprietà tabShowTimeout, entrambi definiti nella sezione precedente, è possibile dunque utilizzare un blocco di codice simile a quello che segue:

public IEnumerable GetScriptDescriptors()
{
  ScriptControlDescriptor descriptor = new ScriptControlDescriptor("Cobisi.TabViewContainer", ClientID);

  descriptor.AddProperty("tabShowTimeout", TabShowTimeout);
  if (String.IsNullOrEmpty(OnClientTabChanged))
    descriptor.AddEvent("tabChanged", OnClientTabChanged);

  yield return descriptor;
}

Come è possibile intuire dal listato precedente, l'evento tabChanged viene qui eventualmente collegato ad un gestore di evento client, ovvero una comune funzione JavaScript accessibile dallo scope del controllo TabViewContainer.

4 pagine in totale: <<Indietro 1 2 [3] 4 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC