ASP.NET 2.0 http://blogs.ugidotnet.org/Crad/category/ASP.NET 2.0.aspx ASP.NET 2.0 it-IT Marco De Sanctis Subtext Version 2.6.0.0 Forzare la rigenerazione del file .designer.cs in ASP.NET http://blogs.ugidotnet.org/Crad/archive/2007/12/18/forzare-la-rigenerazione-del-file-.designer.cs-in-asp.net.aspx <p>In Visual Studio 2005 accade a volte che il file .designer.cs non venga correttamente generato con i controlli contenuti nel markup della pagina.</p> <p>La memoria è corta, quindi me lo segno qui sul blog: per forzarne una rigenerazione, è sufficiente eliminare il file .designer.cs e poi fare tasto-dx sulla pagina, <em>Convert to Web Application</em>.</p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:b8a493eb-0e5f-4b7c-b812-b91b25432878" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/90340.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/12/18/forzare-la-rigenerazione-del-file-.designer.cs-in-asp.net.aspx Tue, 18 Dec 2007 18:05:15 GMT http://blogs.ugidotnet.org/Crad/archive/2007/12/18/forzare-la-rigenerazione-del-file-.designer.cs-in-asp.net.aspx#feedback 5 http://blogs.ugidotnet.org/Crad/comments/commentRss/90340.aspx Quando l'UpdatePanel non fa l'AsyncPostBack... http://blogs.ugidotnet.org/Crad/archive/2007/10/20/quando-lupdatepanel-non-fa-lasyncpostback.aspx <p>...potreste aver dimenticato di assegnare l'ID al vostro LinkButton <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p> <p>Giuro che questa mi ha fatto veramente impazzire, ma è così, provare per credere!!</p> <p>Ma io mica mi fermo qui! Perchè, dannazione??</p> <p>Il PageRequestManager, ad ogni postback, utilizza l'argomento eventTarget della funzione __doPostback per determinare qual è il controllo che ha richiesto il submit e discriminare se eseguire una chiamata out-of-band (ad es. se il controllo si trova dentro ad un UpdatePanel) o meno.</p> <p>Ottimo, ma ovviamente ha bisogno di recuperare un'istanza per capire in che posizione del DOM si trovi. Come fa?</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:22725c16-a377-453c-9d80-6e661cd54560" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">var</span><span style="color: #000000;"> controllo </span><span style="color: #000000;">=</span><span style="color: #000000;"> document.getElementById(</span><span style="color: #000000;">'</span><span style="color: #000000;">....</span><span style="color: #000000;">'</span><span style="color: #000000;">);</span></div></pre></div> <p>Ma... attenzione: se non assegnamo l'ID al LinkButton, ASP.NET emette il seguente markup:</p> <p> </p><div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:ad649e15-cdc2-4199-9b8b-974d66b2b9cc" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">a </span><span style="color: #FF0000;">href</span><span style="color: #0000FF;">="javascript:__doPostBack('ctl03','')"</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;">Btn without Id</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000FF;">&gt;</span></div></pre></div> <p>Sfido chiunque a ritrovare questo tag cercando l'elemento con id='ctl03' <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p> <p> </p><div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:ddfe1865-f433-4036-aa41-cb50f4ecaf2b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>, <a href="http://technorati.com/tags/AJAX" rel="tag">AJAX</a>, <a href="http://technorati.com/tags/UpdatePanel" rel="tag">UpdatePanel</a>, <a href="http://technorati.com/tags/PageRequestManager" rel="tag">PageRequestManager</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/89085.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/10/20/quando-lupdatepanel-non-fa-lasyncpostback.aspx Sat, 20 Oct 2007 02:12:12 GMT http://blogs.ugidotnet.org/Crad/archive/2007/10/20/quando-lupdatepanel-non-fa-lasyncpostback.aspx#feedback 2 http://blogs.ugidotnet.org/Crad/comments/commentRss/89085.aspx Multithreading su Aspitalia.com http://blogs.ugidotnet.org/Crad/archive/2007/10/16/multithreading-su-aspitalia.com.aspx <p>Dopo <a href="http://www.aspitalia.com/articoli/architettura/nhibernate.aspx">il mio precedente lavoro</a> su <a href="http://www.nhibernate.org">NHibernate</a>, oggi <a href="http://www.aspitalia.com">Aspitalia.com</a> ha pubblicato <a href="http://www.aspitalia.com/articoli/asp.net2/multi-threading.aspx">un mio nuovo articolo sul multithreading</a>.</p> <p>Grazie mille a <a href="http://blogs.aspitalia.com/daniele/">Daniele</a> per lo spazio che mi ha concesso e a <a href="http://blogs.aspitalia.com/rickyvr/">Ricky</a> per la pazienza nel correggerlo!</p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:e17002a9-ea13-427f-b53c-4973f297e17b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/Articoli" rel="tag">Articoli</a>, <a href="http://technorati.com/tags/Multithreading" rel="tag">Multithreading</a>, <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/88969.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/10/16/multithreading-su-aspitalia.com.aspx Tue, 16 Oct 2007 11:04:25 GMT http://blogs.ugidotnet.org/Crad/archive/2007/10/16/multithreading-su-aspitalia.com.aspx#feedback 4 http://blogs.ugidotnet.org/Crad/comments/commentRss/88969.aspx Viewstate e controlli dinamici http://blogs.ugidotnet.org/Crad/archive/2007/05/16/78405.aspx <p>Volevo rispondere a <a href="http://blogs.ugidotnet.org/rgm/archive/2007/05/16/78386.aspx">questo post</a> di Gian Maria, poi il testo era un po' lungo e allora ho optato per la modalità stand alone :D</p> <p>Anche in ASP.NET 2.0, come accadeva nella 1.1, è necessario ricreare controlli dinamici durante la fase di Init al fine di preservare correttamente il viewstate. La ragione risiede nel fatto che il ripristino dello stato dei controlli avviene in maniera posizionale. Consideriamo una pagina con una DropDownList (il cui contenuto è ripristinato tramite Viewstate) e il seguente snippet di codice, che aggiunge un button <strong>prima</strong> della ddl stessa:</p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:33d5f724-3a0e-441f-8a43-13873fb97f18" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width: 100%"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000ff">protected</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> Page_Load(</span><span style="color: #0000ff">object</span><span style="color: #000000"> sender, EventArgs e) { </span><span style="color: #0000ff">this</span><span style="color: #000000">.form1.Controls.AddAt(</span><span style="color: #800080">0</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Button()); </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">IsPostBack) { ddlTest.DataSource </span><span style="color: #000000">=</span><span style="color: #000000"> getDataSource(); ddlTest.DataBind(); } }</span></div></pre></div> <p>Se analizziamo il ciclo di vita della pagina, ad esempio attivando il trace, notiamo che l'ordine degli eventi è il seguente (ho volutamente omesso tutto ciò che non interessa questo discorso):</p> <ol> <li>Init </li><li>LoadViewState </li><li>Load </li><li>SaveViewState</li></ol> <p>Bene. Visualizziamo nel browser la nostra pagina, LoadViewState non viene sollevato perché non siamo in un postback, Load costruisce il button dinamico, SaveViewState salva lo stato di un albero di oggetti che, grossomodo è </p> <ul> <li>Button </li><li>DropDownList</li></ul> <p>Supponiamo di effettuare un postback. Cosa accade?</p> <p>LoadViewState prova a ripristinare lo stato del Button, ma questo ancora non esiste: l'evento Load ancora non si è verificato e l'albero degli oggetti ora è composto dalla sola DropDownList! Il risultato è che LoadViewState invierà i dati <strong>del Button</strong> al metodo LoadViewState <strong>della DropDownList</strong>, che ovviamente non sarà in grado di ripristinare correttamente lo stato, proponendoci nel postback una DropDownList vuota.</p> <p>Creando il button in fase di Init, invece, il problema non si pone, dato che LoadViewState opera in un contesto coerente con quello in cui è stato eseguito il SaveViewState al precedente rendering della pagina.</p> <p>EDIT: quanto segue è frutto di uno sforzo congiunto da parte mia e <a href="http://blogs.ugidotnet.org/rgm">del buon Alk</a> :)</p> <p>In ASP.NET 2.0 (devo verificare cosa accade su 1.1) in realtà è comunque possibile aggiungere controlli dinamici in una fase successiva al LoadViewState: basta utilizzare un placeholder o un qualunque altro controllo contenitore. Come è possibile?</p> <p>In fase di postback, la Form ripartisce di nuovo il viewstate tra i suoi controlli di primo livello, al PlaceHolder va una porzione di albero e alla DDL un'altra. Quest'ultima, quindi, non si accorge minimamente dell'esistenza di controlli dinamici, riceve dati corretti e può quindi ripristinare il suo stato.</p> <p>La cosa che sulle prime mi ha sbalordito, è che anche i controlli aggiunti in seguito nel placeholder conservano le informazioni di stato. Non mi spiegavo come ciò fosse possibile, dato che comunque essi vengono creati dopo la fase di LoadViewState. La risposta sta nella classe ControlCollection. Quando viene ripristinato lo stato, un oggetto Control effettua un caching della porzione di viewstate ad esso inviato dal suo contenitore. All'aggiunta di un controllo child</p> <p></p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:1655f965-75a0-4660-a2c1-a03af74007ac" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width: 100%"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000ff">this</span><span style="color: #000000">.plcHolder.Controls.Add(</span><span style="color: #0000ff">new</span><span style="color: #000000"> Button());</span></div></pre></div> <p></p> <p>viene eseguito il metodo Control.AddedControl che, nel caso la cache interna del viewstate non sia vuota, forza un nuovo Load dello stato per il controllo child (eventualmente anche per Id e non più in base all'ordine).</p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:de0decaf-6c12-4f0d-ade3-d228c80a9a73" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/78405.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/05/16/78405.aspx Wed, 16 May 2007 17:27:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/05/16/78405.aspx#feedback 8 http://blogs.ugidotnet.org/Crad/comments/commentRss/78405.aspx Se passate in QueryString dati codificati Base64... http://blogs.ugidotnet.org/Crad/archive/2007/04/30/76923.aspx <p>...ricordatevi di scrivere, prima della decodifica</p> <div class="wlWriterSmartContent" id="F2210F5F-69EB-4d4c-AFF7-B8A050E9CC72:b19bb2c3-465c-42ea-8e63-ac086547430b" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"><pre style="width:100%;;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #0000FF;">string</span><span style="color: #000000;"> goodBase64string </span><span style="color: #000000;">=</span><span style="color: #000000;"> base64FromQueryString.Replace(</span><span style="color: #800000;">"</span><span style="color: #800000;"> </span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">+</span><span style="color: #800000;">"</span><span style="color: #000000;">);</span></div></pre></div> <p>altrimenti potreste ritrovarvi una bella FormatException per "Invalid length for a Base-64 char array".</p> <p>HTH</p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:59ff8a19-acd9-45f1-ae74-95b5f811cbb3" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/76923.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/04/30/76923.aspx Mon, 30 Apr 2007 03:03:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/04/30/76923.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/76923.aspx [FIX] Ancora a proposito di VS2005 e debug su IIS7 http://blogs.ugidotnet.org/Crad/archive/2007/04/22/76215.aspx <p>Nonostante avessi configurato correttamente la Windows Authentication, aperto Visual Studio con i privilegi elevati, ecc.ecc. di punto in bianco non sono riuscito più ad attivare il debug della mia applicazione con il classico F5:</p> <blockquote> <p><em>Unable to start debugging on the Web Server. An authentication error occurred while communicating with the Web Server.</em></p></blockquote> <p>o qualcosa del genere.</p> <p>Sono andato avanti un paio di giorni agganciandomi manualmente al processo w3wp.exe, poi stamattina ho trovato <a href="http://mvolo.com/blogs/serverside/archive/2006/12/28/Fix-problems-with-Visual-Studio-F5-debugging-of-ASP.NET-applications-on-IIS7-Vista.aspx">questo post</a> che mi ha risolto il problema <img alt="smile_teeth" src="http://spaces.live.com/rte/emoticons/smile_teeth.gif" /></p> <p> </p> <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:bfbd93cf-dd1e-465c-bbb0-9f9267877fb2" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati tags: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>, <a href="http://technorati.com/tags/Windows%20Vista" rel="tag">Windows Vista</a></div><img src="http://blogs.ugidotnet.org/Crad/aggbug/76215.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/04/22/76215.aspx Sun, 22 Apr 2007 11:31:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/04/22/76215.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/76215.aspx Un bug veramente noioso di wsdl.exe http://blogs.ugidotnet.org/Crad/archive/2007/04/20/76039.aspx <p>Alcuni web service che sto realizzando, usano come parametri e valori di ritorno dei tipi che implementano l'interfaccia IXmlSerializable.</p> <p>Il tool wsdl.exe utilizzato per generare i proxy per l'accesso lato client, ha un fastidioso bug descritto in <a href="http://support.microsoft.com/kb/815131">questa KB</a>: considera ogni tipo IXmlSerializable come se fosse un dataset e quindi produce metodi con signature errate.</p> <p>L'aspetto più antipatico della questione è che, stando sempre a quanto scritto nella KB che ho linkato, non c'è soluzione se non quella di andare a cambiare a manina ogni metodo incriminato.</p> <p>Uff, non vedo l'ora di migrare completamente a WCF!</p><img src="http://blogs.ugidotnet.org/Crad/aggbug/76039.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2007/04/20/76039.aspx Fri, 20 Apr 2007 12:05:00 GMT http://blogs.ugidotnet.org/Crad/archive/2007/04/20/76039.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/76039.aspx Persistere il ViewState sul database (o dove ci pare) http://blogs.ugidotnet.org/Crad/archive/2006/06/27/43544.aspx Il viewstate di ASP.NET alle volte è una gran comodità, che però paghiamo in termini di prestazioni ad ogni postback, dato che un bel campo hidden di grandezza che a volte può essere considerevole, è costretto ad andare avanti e indietro tra client e server.<br/><br/>Click sul titolo per leggere<img src="http://blogs.ugidotnet.org/Crad/aggbug/43544.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2006/06/27/43544.aspx Tue, 27 Jun 2006 01:27:00 GMT http://blogs.ugidotnet.org/Crad/archive/2006/06/27/43544.aspx#feedback 7 http://blogs.ugidotnet.org/Crad/comments/commentRss/43544.aspx WebServices su HTTPS http://blogs.ugidotnet.org/Crad/archive/2006/06/12/42662.aspx <FONT face=Verdana size=2> <P>Quella passata è stata una settimana a&nbsp;dir poco massacrante, in cui non ho avuto un solo attimo di respiro (weekend compreso). Per fortuna mi sono buttato alcuni impegni alle spalle e all'una e spiccioli di domenica sera ho finalmente il tempo per</P> <OL> <LI>installare Windows Vista Beta 2 (perché io sono tra i comuni mortali che per il momento non hanno a disposizione un abbonamento MSDN) <LI>Bloggare un po' <IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0></LI></OL> <P>Nelle attività che ho svolto ultimamente, mi sono ritrovato nella necessità di invocare un Web Service sotto https senza che il server avesse a disposizione un certificato riconosciuto (il tipico caso in cui, se navigassimo con il browser, beccheremmo un bel warning con dialog box che ci chiede se vogliamo proseguire o meno).</P> <P>Se però stiamo accedendo ad un webservice da codice, ovviamente, non c'è nessuna dialog che ci proponga una qualche scelta, bensì l'invocazione risponde picche e solleva un'eccezione. Come ovviare? Ho trovato una risposta nel blog di <A title="" href="http://weblogs.asp.net/jan/default.aspx" target="" name="">Jan Tielens</A>, ed è raggiungibile clickando <A title="" href="http://weblogs.asp.net/jan/archive/2003/12/04/41154.aspx" target="" name="">qui</A> <IMG height=19 src="http://www.imhoproject.org/files/occhiolino.gif" width=19 align=absMiddle border=0></P> <P> </FONT> <FONT face=Verdana size=2><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/Crad/aggbug/42662.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2006/06/12/42662.aspx Mon, 12 Jun 2006 02:26:00 GMT http://blogs.ugidotnet.org/Crad/archive/2006/06/12/42662.aspx#feedback http://blogs.ugidotnet.org/Crad/comments/commentRss/42662.aspx Stanchi di Javascript? Provate Script# http://blogs.ugidotnet.org/Crad/archive/2006/05/23/41366.aspx <FONT face=Verdana size=2> <P>Premetto che non l'ho provato, provo a darci un'occhiata stasera, ma l'idea del bravo <A title="" href="http://www.nikhilk.net/" target="" name="">Nikhil Kothari</A> mi intriga parecchio: un compilatore C# che invece di generare IL spara fuori del Javascript, con il vantaggio di avere a monte la possibilità di scrivere script lato client con un linguaggio Object Oriented, avere membri pubblici, privati,&nbsp;virtuali, interfacce, supporto per Intellisense e Refactoring di VS2005, ecc.ecc.ecc. Mica male!! Chissà come si comporta in quanto a compatibilità con i diversi browser!</P> <P>BTW, trovate&nbsp;un piccolo articolo introduttivo, il&nbsp;download e anche un filmato&nbsp;<A title="" href="http://www.nikhilk.net/ScriptSharpIntro.aspx" target="" name="">a questo link</A>!</P> </FONT> <FONT face=Verdana size=2><P><A href="http://imhoproject.org/"><FONT face=Verdana size=1>powered by IMHO 1.3</FONT></A></P></FONT><!-- Powered by IMHO 1.3 (EN) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --> <img src="http://blogs.ugidotnet.org/Crad/aggbug/41366.aspx" width="1" height="1" /> Marco De Sanctis http://blogs.ugidotnet.org/Crad/archive/2006/05/23/41366.aspx Tue, 23 May 2006 15:54:00 GMT http://blogs.ugidotnet.org/Crad/archive/2006/05/23/41366.aspx#feedback 1 http://blogs.ugidotnet.org/Crad/comments/commentRss/41366.aspx