Nell'ultima settimana mi sono imbattuto in un problema di banda ... già, nel 2007 ho dovuto ancora tenere conto di possibili connessioni a 56K e di conseguenza stare molto attento alla mole di dati trasferiti dal web server al client.

Tra le pagine che stavo sviluppando ve n'era una particolarmente pesante (un numero non ben precisato di dropdownlist a cascata presenti). Anche utilizzando Ajax le cose non miglioravano di molto, ho provato ad utilizzare le cascadingDropDown di AjaxControlToolkit, che hanno però il grosso difetto (a mio modo di vedere) di non poter utilizzare una chiamata a web service per il popolamento di più dropdown.

Ho colto l'occasione per cercare di sviluppare qualcosa di custom lato client. Bhé sono abbastanza orgoglioso del risultato finale.

1) Evento legato alla onload della pagina.

2) L'evento effettua (in asincrono, mediante chiamate a web services) il popolamento delle dropdownlist presenti nella pagina.

3) Eventuali onchange su dropdown in gerarchia scatenano lo stesso comportamento per le dropdown di livello inferiore.

Il risultato è una pagina leggera che carica i dati di inizializzazione solo alla fine del caricamento della pagina (permettendo così all'utente di poter cominciare a riempire i form). e carica i dati di combo a cascata solo su richiesta.

Adesso mi manca solo una cosa per rendere il tutto ancora più "ottimizzato".

Nello sviluppo di controlli di tipo "WebControls" ho utilizzato il metodo ClientScript.RegisterClientScriptInclude per poter "embeddare" file javascript esterni in modo da farli vedere come WebResources (e quindi farli cachare dal client). La stessa cosa non sono riuscita a farla per componenti di tipo "UserControl". Ho quindi dovuto creare dei WebControls "dummy" in cui fare la registrazione degli script e tutto funziona, ma non mi spiego perché ci sia questa differenza.

Sostanzialmente nel WebControl ho utilizzato l'Attribute [WebResource] per indicare che l'assembly contiene dei file JS inclusi e embedded, ho creato i javascript e li ho definiti come Embedded Resource dell'assembly e sono riuscito a registrarli nella OnPreRender del WebControl. Replicando le stesse attività per gli UserControl, in fase di caricamento della pagina, vedo la chiamata al webResource ma la response è un bell'errore 404.

Chi mi potrà dare una mano ?

 

Technorati Tags: , ,