4 pagine in totale: <<Indietro 1 2 3 [4]
Aggiungere riferimenti a JavaScript esterni
Poichè solitamente le funzionalità client dei controlli sono isolate all'interno di file JavaScript a sé stanti, ASP.NET AJAX consente, come anticipato, di includere in maniera trasparente tali eventuali file durante il caricamento del controllo. Tra l'altro esiste un meccanismo che consente al framework di rilevare l'avvenuto caricamento di uno script, evitando di utilizzarne le funzionalità prima che queste siano disponibili.
L'aggiunta del riferimento all'unico script esterno utilizzato dal controllo TabViewContainer, chiamato per coerenza TabViewContainer.js, può essere effettuata con il semplice blocco che segue:
public IEnumerable GetScriptReferences()
{
yield return new ScriptReference("~/Scripts/TabViewContainer.js");
}
Come si può notare nel listato precedente, è possibile indicare al framework l'inclusione di un file JavaScript esterno, raggiungibile dal client, semplicemente utilizzando il costruttore di ScriptReference ed indicandone il percorso.
La vita in una webform ASP.NET
Ora che anche le basi del codice che governa il controllo lato server sono state gettate, è possibile verificarne il funzionamento all'interno di una webform ASP.NET.
Di fatto, poichè l'infrastruttura server di ASP.NET AJAX gestisce l'intero ciclo di vita dei controlli client, è possibile fare a meno del codice JavaScript di creazione del controllo analizzato in precedenza ed affidarsi al codice analogo che il framework genera all'atto del rendering dello stesso.
Con poca sorpresa infatti una webform opportunamente predisposta per impiegare ASP.NET AJAX può contenere agevolmente TabViewContainer e generare un output del tutto simile a quello ottenuto in precedenza, quando si è analizzato il comportamento del controllo ospitato all'interno di una pagina HTML statica.
Tuttavia, nonostante all'apparenza il controllo sia ben integrato con il resto dell'infrastruttura, quando questo viene messo ad interagire con alcuni controlli ASP.NET, si cominciano a notare alcune discrepanze: nella fattispecie, quando un controllo ospitato da TabViewContainer effettua un postback - operazione frequente tra i componenti di ASP.NET - la selezione del tab corrente viene perduta e di conseguenza resettata. Per ovviare a questo inconveniente, è necessario affrontare un ultimo argomento, in maniera tale da consentire al controllo di sopravvivere tra un postback e l'altro.
La persistenza dello stato
I controlli ASP.NET memorizzano generalmente il proprio stato all'interno di due contenitori speciali, il ViewState ed il ControlState. Come è noto, entrambi questi oggetti effettuano la persistenza del proprio contenuto utilizzando, di default, dei campi HTML nascosti. Lo stato della pagina viene così mantenuto tra un postback ed il successivo, operazione che include tali campi tra i dati spediti al server. Spesso questi campi sono cifrati o comunque sono accompagnati da un hash: di conseguenza, come si può intuire, essi non sono stati progettati per essere impiegati lato client. Come è possibile, dunque, consentire ad un controllo ASP.NET AJAX di manipolare il proprio stato via JavaScript e mantenerlo tra un postback ed il successivo?
Una tecnica ampiamente utilizzata consiste nell'utilizzare un campo nascosto aggiuntivo per ciascun controllo bisognoso di mantenere uno stato: nonostante l'analogia con la persistenza del ViewState e del ControlState, in questo caso il campo nascosto contiene dati comprensibili per il client, direttamente fruibili e modificabili da quest'ultimo.
Utilizzare il metodo del campo nascosto è relativamente semplice; nel caso di TabViewContainer, tale campo potrebbe semplicemente contenere l'indice del tab attivo: il client potrebbe modificarne il valore ed il server potrebbe, in seguito ad un postback, reagire di conseguenza. Casi più complessi, dove lo stato da mantenere è rappresentato da più valori, magari gerarchici o di altra natura, possono trarre beneficio dal supporto per la serializzazione JSON, compreso all'interno di ASP.NET AJAX.
In prima battuta, le modifiche da apportare al controllo per abilitarne la persistenza dello stato richiedono dunque la gestione di un nuovo elemento DOM - il campo nascosto - all'interno del codice JavaScript. Sfruttando la tecnica di nomenclatura dei controlli è possibile fare in modo che tale elemento abbia sempre un identificativo facilmente recuperabile dal componente utilizzatore; rispettando la convenzione di AJAX Control Toolkit, lo stato di TabViewContainer viene memorizzato in un campo nascosto, avente come identificativo quello del controllo stesso a cui viene aggiunto il suffisso _ClientState.
L'inizializzazione di TabViewContainer può dunque recuperare il proprio oggetto di persistenza dello stato:
// All'interno di initialize()
this._clientStateField = $get(this.get_id() + '_ClientState');
ed utilizzarlo a fronte di un cambiamento del tab attivo:
// Salvataggio dello stato del controllo
this._clientStateField.value = tabToShow.Index;
D'altro canto, l'implementazione del controllo lato server richiede il caricamento automatico dello stato ad ogni postback; fortunatamente, implementando l'interfaccia IPostBackDataHandler è possibile richiedere automaticamente ad ASP.NET di notificare il controllo ad ogni postback e definire le operazioni da effettuare per caricare i dati memorizzati nel campo nascosto, che di quest'ultimo descrivono lo stato. In aggiunta, eventuali sviluppi di TabViewContainer potrebbero in tale maniera scatenare un evento server a fronte del cambiamento del tab attivo.
Una volta aggiunto il supporto per la persistenza dello stato, il controllo è finalmente pronto per essere impiegato all'interno di qualsiasi web form e sopravviverne al postback.
Ottimizzazioni
Nonostante tutte le fasi dello sviluppo di un controllo ASP.NET AJAX siano ormai state analizzate, vale però la pena di spendere qualche riga per discutere di come sia possibile migliorarne l'implementazione.
Innanzitutto, sebbene il controllo creato nel corso di questo articolo sia stato inserito in un progetto di sito web, chi sviluppa soluzioni di questo tipo lo fa all'interno di progetti ad hoc, ovvero librerie di codice; così facendo, si ottengono effettivamente i benefici derivanti dalla suddivisione in componenti del proprio lavoro e se ne può organizzare il deploy, indipendentemente dagli utilizzatori. Tra l'altro, il framework consente (anzi, incoraggia) l'utilizzo di risorse embedded - in particolare i file JavaScript, utilizzando l'attributo ScriptResource - all'interno delle proprie librerie; a riprova di ciò, tutti i file JavaScript di ASP.NET AJAX sono memorizzati come risorse embedded all'interno di System.Web.Extensions.dll, la libreria principale.
Infine ASP.NET AJAX rende disponibile la classe astratta ScriptControl derivata da WebControl, che implementa IScriptControl e che si occupa di inizializzarne il supporto in maniera opportuna; nel corso dell'articolo si è preferito implementare l'interfaccia menzionata piuttosto che derivare il controllo da tale classe, in maniera tale da dare una visione d'insieme quanto più possibile completa al lettore. Tuttavia, derivare i propri controlli da ScriptControl potrebbe semplificarne leggermente il codice (pagando il prezzo di non poter derivare la propria classe da qualcos'altro).
Conclusioni
Chi utilizza ASP.NET AJAX spesso sottovaluta la notevole mole di funzionalità che questo framework mette a disposizione dello sviluppatore. Come è stato possibile osservare, al di là dell'estensione del modello ad oggetti JavaScript, questa piattaforma consente infatti di rendere effettivo il dualismo client-server dei controlli, dando a questi ultimi vita ed autonomia laddove in precedenza esisteva staticità.
Sebbene questo articolo abbia esplorato ogni fase relativa allo sviluppo di controlli di tale genere, la dimestichezza con ASP.NET AJAX si acquisisce solo con uno studio ed una pratica costante; di conseguenza, quanto visto fino a qui deve essere considerato un mero punto di partenza, da cui muovere i primi passi.
4 pagine in totale: <<Indietro 1 2 3 [4]
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Stampa
Download



