in

DotNetMarche

.NET Framework User Group delle Marche

Articoli

Alcune considerazioni sull'Atlas.UpdatePanel

Di: Ricci Gian Maria

Il nuovo framework AJAX per ASP.NET 2.0 nonostante sia ancora in beta è indubbiamente un prodotto molto interessante. In questo articolo verranno esposte alcune particolarità interessanti del controllo UpdatePanel che presenta comportamenti anomali in alcune situazioni.

Creare un controllo che fa uso di UpdatePanel

L’UpdatePanel è senza dubbio uno dei controlli più utili di Atlas, purtroppo però ci sono alcune particolarità che è bene conoscere, per evitare di incappare in spiacevoli inconvenienti.

Spesso l’UpdatePanel viene inserito all’interno di controlli utente. Nell’esempio accluso si può infatti vedere che il Controllo1.ascx, ha due semplici combo per effettuare una selezione a cascata racchiuse da un UpdatePanel, il cui scopo è essenzialmente quello di impedire che ad ogni selezione tutta la pagina venga nuovamente renderizzata.

Naturalmente la pagina ospitante (Page1.aspx) deve contenere un controllo ScriptManager ed abilitare il PartialRendering affinché tutto funzioni correttamente. Purtroppo come si può vedere eseguendo la Page2.aspx se il controllo utente viene utilizzato all’interno di un controllo Wizard si generano errori javascript quando si effettua il postback della pagina. Spendendo un po’ di tempo debuggando il javascript dell’Atlas si scopre che l’errore è dovuto al fatto che il controllo Wizard renderizza nella pagina solamente i controlli del tab corrente. Purtroppo Atlas esaminando il codice sorgente della pagina nota che sono presenti due istanze del Controllo1.ascx ed quindi nella pagina sono effettivamente presenti due controlli UpdatePanel. Questo fa si che durante il postback il codice javascript si aspetta che la pagina contenga entrambi gli UpdatePanel, purtroppo però quello relativo al tab non attivo del Wizard non è in realtà presente nel DOM della pagina ed ecco la sorgente dell’errore.

Risolvere il problema del wizard

La soluzione è nel Controllo2.ascx e consiste semplicemente nell’utilizzo corretti dei trigger degli UpdatePanel, in modo da indicare al motore javascript di Atlas di aggiornare l’UpdatePanel solamente quando la prima combo genera l’evento di cambio indice. In questo a runtime durante il postback causato da un controllo Atlas cerca di aggiornare solamente l’UpdatePanel per cui il trigger è stato attivato, ignorando quindi gli UpdatePanel che non sono effettivamente presenti nella pagina.

Purtroppo i problemi non sono finiti. Nella pagina Page4.aspx un altro bug si genera quando si tenta di creare dinamicamente da codice un’istanza del Controllo2.ascx.

Purtroppo anche in questo caso a runtime Atlas va in errore, questa volta però non si genera un errore javascript, ma viene mostrata un educata messagebox in cui l’utente è avvertito del fatto che il nome del controllo utilizzato per il trigger non è valido. Per capire l’origine di questo altro problema bisogna confrontare ciò che viene renderizzato nel caso di controllo incluso a design time (page1.aspx) con il DOM della pagina dinamica. Nel caso di inclusione a design time in particolare ecco come viene renderizzata la prima dropDownList del controllo utente.

Mentre ecco quello che appare nella pagina che include dinamicamente il controllo.

In questo caso molto probabilmente il motore javascript di Atlas quando esamina la struttura della pagina genera il javascript corrispondente considerando che i nomi dei controlli nel DOM vengano generati sempre con lo stesso criterio. Purtroppo per i controlli dinamici il nome del controllo segue una regola di denominazione differente e da qui l’errore, perché si cerca nel DOM il nome di un controllo inesistente.

Generare trigger dinamicamente

Il problema precedente è derivato dal trigger e se il ragionamento fatto in precedenza è corretto la soluzione è semplicemente generare dinamicamente tutti i trigger nell’evento PreRender del controllo utente. Questa accortezza permette di indicare in modo corretto l’id del controllo.

Se si esegue un run della pagina in modalità debug si può notare che il vero id del controllo è MyId_DropDownList1 e dato che questa volta siamo direttamente noi da codice che lo indichiamo per il trigger, il problema viene aggirato.

Un ulteriore considerazione

Talvolta accade che abilitando il partial rendering si generino errori javascript in linee che non esistono tipo 8.329.456 e che non è possibile debuggare. Questi errori sono quasi sempre generati da javascript incluso in modo non corretto nella pagina. Così come Microsoft stessa spiega nel punto 9 del documento Building Asp.NET2.0 web sites Using Web Standards non è possibile includere codice javascript nella pagina XHTML senza particolari accortezze, perché potrebbe alterare la struttura del documento. In sostanza la pagina html deve essere un documento XML valido, ma se nel javascript si utilizzano segni come < e > la validità del documento XML cade. A questo punto, dato che è impossibile utilizzare le sequenze di escape &lt; &amp; perché altrimenti il codice javascript non funzionerebbe, la soluzione è includere tutto in una sezione CDATA. In sostanza Microsoft consiglia di inserire uno script in questo modo

Talvolta nemmeno questo funziona e gli errori javascript continuano a presentarsi, un approccio più conservativo è invece il seguente

Includendo tutti gli script della pagina in apposite sezioni CDATA si è certi che la struttura XML del documento verrà preservata e ATLAS non genererà strani errori durante il PartialRendering.

Conclusioni

Atlas è sicuramente uno dei prodotti più interessanti per ASP.NET 2.0; è gratuito, è Microsoft e promette grandi funzionalità. Nonostante questo non bisogna mai dimenticare che è ancora un prodotto in beta ed è quindi inevitabile incontrare nello sviluppo qualche piccolo ostacolo, che però può sempre essere superato con un po’ di pazienza e una buona sessione di debugging.

Bibliografia

Sito ufficiale dell’Atlas

Published Sep 21 2006, 10:09 AM by Alkampfer
Filed under:
Attachment: Esempio.zip

Comments

No Comments

About Alkampfer

Chi sono

Mi chiamo Gian Maria Ricci, sono nato il 18/08/1974 e il fatto che mi troviate qui in dotnetmarche significa che per passione e per lavoro mi occupo di .NET.

Sono laureato in Ingegneria Elettronica con specializzazione in Microelettronica, ma la mia passione è sempre stata la programmazione, che coltivo da quando mi fu regalato il mitico Vic20 un paio di decadi fa. Passato per il Basic, alle superiori ho programmato in Pascal e Prolog con qualche deviazione in Fortran e Cobol, fino ad approdare al C/C++. Per lavoro ho poi conosciuto il VB6 ed ho iniziato ad apprezzare il .NET fin dalle beta, tanto da utilizzare .NET come ambiente di sviluppo per la mia tesi.

Oltre che di dotnetmarche faccio parte del gruppo nablasoft, formato da miei ex colleghi di università con cui ho condiviso e condivido ancora la passione per la computer graphics. Tra i lavori prodotti per nablasoft, sicuramente quello di cui vado più orgoglioso è un tutorial in lingua inglese sulla programmazione della Playstation2 tramite il linux kit che ancora oggi ci da una visibilità al primo posto in alcune ricerche di google. Nel sito trovate inoltre altri lavori miei e dei miei colleghi che spaziano dalla matematica, all’elettronica e naturalmente anche al .NET.

Tra le mie altre partecipazioni a gruppi web posso citare GPI (game programming italia) per il quale ricopro il ruolo di responsabile della sezione playstation2, anche se la mia attività è sicuramente stata molto breve ed è molto che non contribuisco più in maniera attiva.

Le mie pubblicazioni

Nel corso degli anni oltre a pubblicare materiale nel sito nablasoft, ho collaborato con altre realtà come www.programmazione.it, il gruppo playstation2linux ed il gruppo infomedia di cui sono articolista principalmente per la rivista dev.

  • "Funzionali ed adattatori nella STL"- Computer Programming (aprile 2004).
  • "Esportare il contenuto di una DataGrid in Microsoft Excel" –Computer Programming (maggio 2004)
  • "Garbage Collection in ambiente .NET" – Computer Programming (luglio 2004)
  • "Serializzazione e persistenza in database" –DEV (Luglio 2004)
  • "Programmare la PS2 tramite il Linux kit. Introduzione" - DEV (settembre 2004)
  • "Utilizzare la libreria zlib in C# o VB.NET" - DEV (agosto 2004)
  • "Programmare la PS2 tramite il Linux kit. Renderizzare un cubo" – DEV (ottobre 2004)
  • "Utilizzo di puntatori per elaborare immagini in C#" - DEV (novembre 2004)
  • "Programmare la PS2 tramite il Linux kit. Utilizzare il joypad" - DEV (novembre 2004)
  • "Personalizzare l'aspetto dei menu con GDI+" - DEV (dicembre 2004)
  • "Utilizzare MSDE in applicazioni desktop. Installazione e gestione" – DEV (dicembre 2004)
  • "Utilizzare MSDE in applicazioni desktop. Deployment" – DEV (gennaio 2005)
  • "PC o console, tecniche di sviluppo a confronto" – DEV (gennaio 2004)
  • "CLR Profiler per .NET - Stringhe e finalizzazione" – Computer Programming (gennaio 2005)
  • "Utilizzare MSDE in applicazioni desktop. Distribuire la struttura di database" – DEV (febbraio 2005)
  • "Comunicare in rete tramite C#" – DEV (febbraio 2004)
  • "CLR Profiler per .NET – Pool di oggetti" – Computer Programming (febbraio 2005)
  • "Amministrare le politiche in Active Directory" – Login (marzo/aprile 2005)
  • "Spedire mail in C#" – DEV (aprile 2005)
  • "Utilizzare API di shell in C#" – DEV (maggio 2005)
  • ".NET e remoting" – DEV (Maggio 2005)
  • "Utilizzare Dll C++ in Visual Basic 6" – DEV (Maggio 2005)
  • "Sql Server 2005 - Scrivere un aggregatore custom in Visual Basic" – DEV (Giugno 2005)
  • "Utilizzare le API di shell in C# - 2a parte" – DEV (Giugno 2005)
  • "Utilizzare le API di shell in C# - 3a parte" – DEV (Settembre 2005)
  • "Trasferire una sessione da ASP ad ASP.NET " – DEV (Settembre 2005)
  • "Unit testing in .NET 2.0" – DEV (Ottobre 2005)
  • "Visual Studio 2005 Class diagram" – DEV (Ottobre 2005)
  • "Nullable Types in .NET 2.0", DEV (Novembre 2005)
  • "Creare Una trial in C#", DEV (Dicembre 2005)
  • "Linguaggi ed evoluzione di sintassi", DEV (Gennaio 2006)
  • "C# 2.0 Evoluzioni sintattiche”, DEV (Gennaio 2006)
  • "Office Web Components - Realizzare un report in Excel", DEV (Gennaio 2006)
  • "VB.NET e Sql Server 2005 - Scrivere stored procedures in VB.NET", DEV (Febbraio 2006)
  • "Persistence Frameworks in C#”, DEV (Maggio 2006)
  • "Persistenza con serializzazione XML in .NET 2.0", DEV (Maggio 2006)
  • ".NET 2.0 – Enterprise Library 2.0, logging", DEV (Maggio 2006)
  • "Database - XML e SQL Server 2005", DEV(Giugno 2006)
  • "Enterprise Library 2.0 Logging - Seconda parte", DEV (Giugno 2006)
  • "ASP.NET 2.0 e AJAX", DE (Luglio 2006)

  • PS2 3D programming Tutorial - Tutorial sulla programmazione 3D per la console Playstation 2 Pubblicato nel sito ufficiale Sony per il kit PS2 linux.

<script src="http://feeds.feedburner.com/AlkampferEng?format=sigpro" type="text/javascript" ></script><noscript>

Subscribe to RSS headline updates from:
Powered by FeedBurner

</noscript>
Powered by Community Server (Commercial Edition), by Telligent Systems