<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ASP.NET [Italiano]</title>
        <link>http://blogs.ugidotnet.org/raffaele/category/528.aspx</link>
        <description>Programmazione di ASP.NET (lingua Italiana)</description>
        <language>it-IT</language>
        <copyright>Raffaele Rialdi</copyright>
        <managingEditor>malta@vevy.com</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Scott Guthrie a Roma ... che silenzio!</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2005/02/08/10456.aspx</link>
            <description>&lt;P&gt;Ma insomma, tanto rumore per Scott Guthrie, il pap&amp;#224; di asp.net, a Roma. Si dice evento unico, tutti che corrono a vederlo (io proprio non potevo esserci) e alla fine ... silenzio totale sui blog, sul msn, sui vari web.&lt;/P&gt;
&lt;P&gt;Delusione o pubblico esigente? Devo cominciare a preoccuparmi per il &lt;A href="http://www2.ugidotnet.org/workshops/workshops_detail.aspx?ID=680d4301-41c9-4a5e-8f62-66563ebecd47"&gt;nostro evento del 10 Febbraio&lt;/A&gt;?&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/10456.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2005/02/08/10456.aspx</guid>
            <pubDate>Tue, 08 Feb 2005 09:55:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/10456.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2005/02/08/10456.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/10456.aspx</wfw:commentRss>
        </item>
        <item>
            <title>XmlHttp e le applicazioni server</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7053.aspx</link>
            <description>&lt;P&gt;In riferimento alla giusta &lt;A href="http://blogs.ugidotnet.org/fabioc/archive/2004/12/14/7051.aspx"&gt;raccomandazione di Fabio&lt;/A&gt; che fa seguito al &lt;A href="http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7033.aspx"&gt;mio post su XmlHttp&lt;/A&gt;, mi preme aggiungere un concetto che avevo gi&amp;#224; &lt;A href="http://groups-beta.google.com/group/microsoft.public.it.dotnet.asp/browse_thread/thread/cd9098330ccb551?as_umsgid=bejue3$5tipm$1@ID-192116.news.dfncis.de"&gt;ribadito a Luglio 2003&lt;/A&gt; nel newsgroup microsoft.public.it.dotnet.asp.&lt;/P&gt;
&lt;P&gt;XmlHttp &amp;#232; lo strumento giusto se lo si usa sul client ma attenzione a non usarlo dentro una applicazione server come asp.net. Questa limitazione &amp;#232; dovuta al fatto che usa la libreria Wininet che tra le altre cose limita le connessioni contemporanee.&lt;/P&gt;
&lt;P&gt;Questo &amp;#232; il motivo per cui esiste ServerXmlHttp che &amp;#232; un ottimo sistema per dialogare tra un'applicazione asp ed una asp.net.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/7053.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7053.aspx</guid>
            <pubDate>Tue, 14 Dec 2004 14:03:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/7053.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7053.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/7053.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Finalmente XmlHttp prenderà piede</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7033.aspx</link>
            <description>&lt;P&gt;Come ho visto il &lt;A href="http://blogs.ugidotnet.org/PenPal/archive/2004/12/13/6950.aspx"&gt;post di Andrea&lt;/A&gt; sono subito andato a vedere il sorgente dello script di &lt;A href="http://www.google.com/webhp?complete=1&amp;amp;hl=en"&gt;Google Suggest&lt;/A&gt; e con piacere ho visto confermare la mia ipotesi, cio&amp;#232; l'uso del componente XmlHttp.&lt;/P&gt;
&lt;P&gt;&amp;#200; dai tempi di asp che mi dilettavo a eseguire il &lt;STRONG&gt;binding&lt;/STRONG&gt; con la &amp;lt;table&amp;gt; &lt;STRONG&gt;sul lato client&lt;/STRONG&gt; e prelevare/aggiornare recordset disconnessi dal server via XmlHttp. Correvano gli anni in cui continuavo a tenere in aula il mitico corso 1017A (Mastering Web Application Development using Visual Interdev) opportunamente modificato (chi lo conosce sa di cosa parlo) ed uno dei sample che avevo sviluppato ad-hoc usava proprio XmlHttp per evitare il refresh del browser.&lt;/P&gt;
&lt;P&gt;Poi un giorno vedo la beta 1 del framework 1.0 e guardando asp.net mi dico: &amp;#8220;user&amp;#224; sicuramente XmlHttp per i postback&amp;#8220; ... e invece no, con grande delusione.&lt;/P&gt;
&lt;P&gt;Il tempo passa e sui forum di &lt;A href="http://forum.ugidotnet.org"&gt;UGIdotNET&lt;/A&gt; e sui newsgroup ho continuato ad istigare tanti ad usarlo e qualcuno mi ha pure dato retta.&lt;/P&gt;
&lt;P&gt;Poi un giorno alla PDC 2003, un certo &lt;A href="http://www.nikhilk.net/Category.aspx?id=1"&gt;Nikhil Kothari&lt;/A&gt; annuncia che in Asp.net 2.0 alcuni nuovi server controls (direi che &lt;A href="http://www.amazon.com/exec/obidos/ASIN/0735615829/nikhilkothari-20/102-0661259-3611320"&gt;lui se ne capisce&lt;/A&gt; ;-)) usano XmlHttp per il meccanismo di postback.&lt;/P&gt;
&lt;P&gt;Finalmente arriva il momento della diffusione e ora che Google user&amp;#224; questo componente, non ci sar&amp;#224; pi&amp;#249; browser che non lo possa supportare.&lt;/P&gt;
&lt;P&gt;Che sollievo!&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/7033.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7033.aspx</guid>
            <pubDate>Tue, 14 Dec 2004 10:19:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/7033.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/12/14/7033.aspx#feedback</comments>
            <slash:comments>15</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/7033.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Color injection?</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/12/13/6965.aspx</link>
            <description>&lt;P&gt;Io e &lt;A href="http://blogs.ugidotnet.org/pape/"&gt;Andrea&lt;/A&gt; abbiamo appena ricevuto&amp;nbsp;una mail da &lt;A href="http://weblogs.asp.net/despos"&gt;Dino&lt;/A&gt;&amp;nbsp;e personalmente la stavo per prendere come una divertente sfottitura al &lt;STRONG&gt;giustificato&lt;/STRONG&gt; panico da injection che si sta diffondendo.&lt;/P&gt;
&lt;P&gt;Invece &amp;#232; una cosa serissima e&amp;nbsp;invito tutti a &lt;A href="http://weblogs.asp.net/despos/archive/2004/12/13/281200.aspx"&gt;leggere il suo post&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/6965.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/12/13/6965.aspx</guid>
            <pubDate>Mon, 13 Dec 2004 10:04:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/6965.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/12/13/6965.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/6965.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Asp.net canonicalization bug: non fidatevi ciecamente della fix</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/10/12/4195.aspx</link>
            <description>&lt;P&gt;&amp;#200; capitato, e quindi &amp;#232; un precedente a cui stare molto attenti. La &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=da77b852-dfa0-4631-aaf9-8bcc6c743026&amp;amp;displaylang=en"&gt;patch&lt;/A&gt; si installa solo se trova asp.net installato... e fin qui sembra una cosa corretta.&lt;/P&gt;
&lt;P&gt;Il problema &amp;#232; che &lt;STRONG&gt;asp.net pu&amp;#242; funzionare anche se apparentemente non &amp;#232; installato&lt;/STRONG&gt;.... come? Asp.net &amp;#232; 'ufficialmente' installato quando &amp;#232; impostata la chiave di registry:&lt;BR&gt;HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322\Install = 1&lt;/P&gt;
&lt;P&gt;Quindi accade che asp.net ci sia, funzioni, il comando &amp;#8220;aspnet_regiis -lv&amp;#8221; dice che tutto &amp;#232; ok, ma la chiave di registry dice che asp.net non c'&amp;#232;.&lt;/P&gt;
&lt;P&gt;Quando capita questa strana cosa (a dire il vero &amp;#232; una cosa rara anche se non saprei dire quanto) il machine.config &lt;STRONG&gt;non viene patchato&lt;/STRONG&gt; e quindi &lt;STRONG&gt;si resta vulnerabili&lt;/STRONG&gt;.&lt;BR&gt;Il rimedio &amp;#232; presto fatto: controllare che&amp;nbsp;in tutti i machine.config delle versioni di framework installate sul pc, al tag &amp;lt;httpModules ... /&amp;gt; ci sia questa riga:&lt;BR&gt;&amp;lt;add name="ValidatePathModule" type="Microsoft.Web.ValidatePathModule, Microsoft.Web.ValidatePathModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=eba19824f86fdadd"/&amp;gt;&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/4195.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/10/12/4195.aspx</guid>
            <pubDate>Tue, 12 Oct 2004 13:30:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/4195.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/10/12/4195.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/4195.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Asp.net canonicalization bug: nuovo articolo di KB</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/10/08/3966.aspx</link>
            <description>&lt;P&gt;Come gi&amp;#224; anticipato da Lorenzo &lt;A href="http://blogs.ugidotnet.org/lbarbieri/archive/2004/10/08/3937.aspx"&gt;qui&lt;/A&gt;, &amp;#232; disponibile la &lt;A href="http://www.microsoft.com/downloads/details.aspx?familyid=da77b852-dfa0-4631-aaf9-8bcc6c743026&amp;amp;displaylang=en"&gt;patch&lt;/A&gt; (cio&amp;#232; un HttpModule) che risolve il bug per tutti siti asp.net su un server.&lt;/P&gt;
&lt;P&gt;In questo &lt;A href="http://support.microsoft.com/?kbid=887289"&gt;nuovo articolo&lt;/A&gt; viene spiegato come funziona il nuovo Microsoft.Web.ValidatePathModule installato nel machine.config ed altre importanti informazioni sull'installazione/disinstallazione.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/3966.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/10/08/3966.aspx</guid>
            <pubDate>Fri, 08 Oct 2004 09:45:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/3966.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/10/08/3966.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/3966.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Il bug c'è ma non è della Forms Authentication</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/10/02/3615.aspx</link>
            <description>&lt;P&gt;Quando ho letto il link che &lt;A href="http://blogs.ugidotnet.org/lbarbieri"&gt;Lorenzo&lt;/A&gt; e poi &lt;A href="http://blogs.ugidotnet.org/pape"&gt;Andrea&lt;/A&gt; mi hanno mandato riguardante il bug della forms authentication, mi &amp;#232; venuto subito l'atroce sospetto e dopo un veloce test ho avuto la conferma.&lt;/P&gt;
&lt;P&gt;Il bug riguarda le autorizzazioni di asp.net indipendentemente dal tipo di autenticazione usata.&lt;/P&gt;
&lt;P&gt;Si, avete capito bene, &lt;STRONG&gt;con lo stesso exploit ho potuto bucare un progetto di test interamente protetto con la Windows Authentication&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Ovviamente non si tratta di un bug di Kerberos o di Windows. L'autenticazione Windows deve avere luogo altrimenti l'utente non pu&amp;#242; fare nulla.&lt;BR&gt;Io mi sono loggato alla home page della web app di test come semplice user. Quindi ho protetto una pagina in modo che solo gli administrators potessero raggiungerla.&lt;BR&gt;Nella home page del progetto ho creato due link alla pagina protetta: un link 'normale' ed uno con il %5C. Il risultato &amp;#232; stato quello aspettato e con il secondo link sono riuscito ad entrare nella pagina di admin anche se ero loggato come semplice utente.&lt;/P&gt;
&lt;P&gt;Il bug sembra proprio girare intorno al modulo di autorizzazione, non ho potuto ancora identificare di preciso il punto, visto che sono lontano dalla mia postazione operativa.&lt;BR&gt;Al mio rientro non esiter&amp;#242; a scomodare i sorgenti del framework per identificare meglio il problema.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/3615.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/10/02/3615.aspx</guid>
            <pubDate>Sat, 02 Oct 2004 19:32:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/3615.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/10/02/3615.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/3615.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Redirigere l'utente su una pagina alla scadenza della Session</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/09/22/3118.aspx</link>
            <description>&lt;P&gt;Ho raccolto recentemente una domanda su come si potesse redirezionare su una certa pagina l'utente a cui sia scaduta la sessione.&lt;BR&gt;Effettivamente alcune volte nella Session_Start non sempre si hanno a disposizione tutte le informazioni per poter ricostruire i dati di una Session ormai scaduta. Soluzioni alternative certamente ci sono ma volendo scegliere questa strada, ecco una possibile soluzione.&lt;/P&gt;
&lt;P&gt;L'evento PreRequestHandlerExecute viene eseguito prima di ogni richiesta di pagina ed ha in pi&amp;#249; il privilegio di poter accedere alla Session.&lt;BR&gt;Se un valore arbitrario della session non &amp;#232; presente, significa che la session &amp;#232; nuova e quindi devo redirigere l'utente sulla pagina prestabilita (Webform1.aspx nell'esempio).&lt;/P&gt;
&lt;P&gt;Nel global.asax.cs:&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=1&gt;protected&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;void&lt;/FONT&gt;&lt;FONT size=1&gt; Application_PreRequestHandlerExecute(Object sender, EventArgs e)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;&amp;nbsp;&amp;nbsp; string&lt;/FONT&gt;&lt;FONT size=1&gt; Uri = HttpContext.Current.Request.Url.AbsoluteUri.ToLower();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=1&gt;(Uri.EndsWith("WebForm1.aspx".ToLower()))&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;&lt;FONT size=1&gt;(Session["test"] == &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;Response.Redirect("~/Webform1.aspx");&lt;BR&gt;}&lt;/P&gt;&lt;/FONT&gt;
&lt;P&gt;I pi&amp;#249; critici si domanderanno perch&amp;#232; il ToLower() sulla stringa literal. Il motivo &amp;#232; solo un promemoria per chi dovesse metterci una stringa, una funzione o quant'altro. Occhio insomma a non dimenticarsi di confrontare le stringhe con lo stesso 'case'.&lt;BR&gt;Ovviamente nella webform1.aspx.cs &amp;#232; poi necessario inizializzare quel valore in modo arbitrario:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;Session["test"] == &amp;#8220;1&amp;#8221;;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Banale, quasi scontato, ma a volte utile ...&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/3118.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/09/22/3118.aspx</guid>
            <pubDate>Wed, 22 Sep 2004 17:03:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/3118.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/09/22/3118.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/3118.aspx</wfw:commentRss>
        </item>
        <item>
            <title>[ASP.NET] Un custom control per dare il focus lato client</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2004/09/21/3059.aspx</link>
            <description>&lt;P&gt;Avete presente quando caricate la pagina di google quanto sia comodo avere subito il focus sulla textbox di ricerca?&lt;BR&gt;Lo script da usare &amp;#232; estremamente semplice:&lt;BR&gt;
&lt;SCRIPT language='\"javascript\"'&gt;&lt;!--&lt;BR&gt;document.all['IdControlloLatoClient'].focus();&lt;BR&gt;// --&gt;&lt;/SCRIPT&gt;
&lt;BR&gt;dove IdControlloLatoClient &amp;#232; l'id del controllo a cui dare il focus, tassativamente ottenuto con la propriet&amp;#224; ClientID.&lt;BR&gt;Lo script va poi registrato con il metodo RegisterStartupScript.&lt;/P&gt;
&lt;P&gt;Per risolvere la questione in modo pi&amp;#249; elegante ho buttato gi&amp;#249; un piccolo custom control che registra questo script.&lt;BR&gt;&lt;FONT size=1&gt;&lt;BR&gt;[DefaultProperty("FocusControl"), ToolboxData("&lt;{0}:FirstFocus runat=server&gt;")]&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;class&lt;/FONT&gt;&lt;FONT size=1&gt; FirstFocus : Control&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   private&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; StartScript = "\r\n
&lt;SCRIPT language='\"javascript\"'&gt;&lt;!-- \r\n";&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   private&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; EndScript = "\r\n// --&gt;&lt;/SCRIPT&gt;
 ";&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   protected&lt;/FONT&gt;&lt;FONT size=1&gt; Control FindNestedControl(Control root, &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; name)&lt;BR&gt;   {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      foreach&lt;/FONT&gt;&lt;FONT size=1&gt;(Control ctl &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; root.Controls)&lt;BR&gt;      {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt;(ctl.ID == name)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt; ctl;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt;(ctl.HasControls())&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt; FindNestedControl(ctl, name);&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;&lt;BR&gt;   protected&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; GetControlRenderID(&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; name)&lt;BR&gt;   {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;//Control ctl = FindControl(name);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;      Control ctl = FindNestedControl(Page, name);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt; (ctl == &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt; "";&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; ctl.ClientID;&lt;BR&gt;   }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   &lt;BR&gt;   protected&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;override&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;void&lt;/FONT&gt;&lt;FONT size=1&gt; OnPreRender(EventArgs e)&lt;BR&gt;   {&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt;(FocusControl == &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;.Empty)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      string&lt;/FONT&gt;&lt;FONT size=1&gt; CID = GetControlRenderID(FocusControl);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt;(CID != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;.Empty)&lt;BR&gt;&lt;FONT color=#0000ff&gt;         &lt;/FONT&gt;Page.RegisterStartupScript(ClientID, StartScript + "document.all['" + CID + "'].focus();" + EndScript);&lt;BR&gt;   }&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;&lt;SUMMARY&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;   ///&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt; Il control ID da specificare nel caso degli UserControl &amp;#232; quello dello UserControl&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;   ///&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt; Poi &amp;#232; necessario che lo UserControl faccia l'override della propriet&amp;#224; ClientID&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;   ///&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt; e restituisca al posto del proprio quello del controllo che si vuole guadagni il focus&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;   ///&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt; &lt;/FONT&gt;&lt;FONT color=#808080 size=1&gt;&lt;/SUMMARY&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;   [Category("Behaviour"), &lt;BR&gt;   DefaultValue(""),&lt;BR&gt;   Description("Control you wish will gain control at load time"),&lt;BR&gt;   TypeConverter(&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;typeof&lt;/FONT&gt;&lt;FONT size=1&gt;(AllPageControlsConverter))]&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; FocusControl&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      get&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         string&lt;/FONT&gt;&lt;FONT size=1&gt; ctl = ViewState["FocusControl"] &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;as&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt; (ctl == &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) ? &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;.Empty : ctl;&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      set&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;         &lt;/FONT&gt;ViewState["FocusControl"] = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;value&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;}&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT size=1&gt;
&lt;P&gt;&lt;FONT size=2&gt;Per rendere pi&amp;#249; gradevole l'uso del controllo ho poi costruito un UITypeConverter per scegliere a design time, con una combo nella property toolbox, il controllo a cui dare il focus.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;class&lt;/FONT&gt;&lt;FONT size=1&gt; AllPageControlsConverter : StringConverter&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   private&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;object&lt;/FONT&gt;&lt;FONT size=1&gt;[] GetControls(ITypeDescriptorContext context)&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;IContainer container = context.Container;&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;ComponentCollection coll = container.Components;&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;ArrayList list = &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; ArrayList();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      foreach&lt;/FONT&gt;&lt;FONT size=1&gt; (IComponent comp &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;in&lt;/FONT&gt;&lt;FONT size=1&gt; coll)&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         if&lt;/FONT&gt;&lt;FONT size=1&gt; (!(comp &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;is&lt;/FONT&gt;&lt;FONT size=1&gt; Control))&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;            continue&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;         &lt;/FONT&gt;Control ctl = (Control) comp;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         if&lt;/FONT&gt;&lt;FONT size=1&gt; ((ctl.ID != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;) &amp;&amp; (ctl.ID.Length != 0) &amp;&amp; (ctl.ID != (((Control)context.Instance)).ID))&lt;BR&gt;&lt;FONT color=#0000ff&gt;         &lt;/FONT&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;            &lt;/FONT&gt;list.Add(&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt;.Copy(ctl.ID));&lt;BR&gt;&lt;FONT color=#0000ff&gt;         &lt;/FONT&gt;}&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;}&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;list.Sort(Comparer.Default);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; list.ToArray();&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;override&lt;/FONT&gt;&lt;FONT size=1&gt; TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt; (context == &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt; || context.Container == &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;      &lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;object&lt;/FONT&gt;&lt;FONT size=1&gt;[] ctls = GetControls(context);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      if&lt;/FONT&gt;&lt;FONT size=1&gt; (ctls != &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;)&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;         return&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;new&lt;/FONT&gt;&lt;FONT size=1&gt; TypeConverter.StandardValuesCollection(ctls);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;null&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;&lt;BR&gt;   public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;override&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;bool&lt;/FONT&gt;&lt;FONT size=1&gt; GetStandardValuesExclusive(ITypeDescriptorContext context)&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;false&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;override&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;bool&lt;/FONT&gt;&lt;FONT size=1&gt; GetStandardValuesSupported(ITypeDescriptorContext context)&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;true&lt;/FONT&gt;&lt;FONT size=1&gt;;&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;Infine un ultimo particolare: e se il controllo a cui dare il focus &amp;#232; contenuto all'interno di uno UserControl? La risposta &amp;#232; semplice, basta fare l'override nello user control della propriet&amp;#224; ClientID e restituire quello del controllo 'principale'. In questo modo, indicando lo user control come destinatario del focus, verr&amp;#224; letto il ClientID del controllo contenuto nello User Control.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=1&gt;&lt;BR&gt;&lt;FONT color=#808080&gt;///&lt;/FONT&gt;&lt;FONT color=#008000 size=1&gt; propriet&amp;#224; ClientID dello User Control&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;public&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;override&lt;/FONT&gt;&lt;FONT size=1&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;string&lt;/FONT&gt;&lt;FONT size=1&gt; ClientID&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;   get&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=1&gt;      return&lt;/FONT&gt;&lt;FONT size=1&gt; txtUsername.ClientID;   &lt;FONT color=#008000&gt;// txtUsername &amp;#232; il controllo contenuto nello User COntrol a cui si vuole dare il focus&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;   &lt;/FONT&gt;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;&lt;FONT size=2&gt;&lt;FONT size=1&gt;&lt;FONT size=2&gt;Ci sono sicuramente degli spunti di miglioramento, come il &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT size=2&gt;&lt;FONT size=1&gt;&lt;FONT size=2&gt;piccolo spreco nel viewstate per conservare il nome del controllo. Ma a me &amp;#232; bastato cos&amp;#236; ...&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;&lt;FONT size=2&gt;&lt;FONT size=1&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/3059.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2004/09/21/3059.aspx</guid>
            <pubDate>Tue, 21 Sep 2004 19:35:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/3059.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2004/09/21/3059.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/3059.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>