<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//az//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2012 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2012.5.12</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Sun, 12 Oct 2008 12:46:17 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//az//</link></image><item><title>Un po&amp;#39; di benchmark tra Linq, Entity Framework e Nhibernate</title><link>http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx</link><pubDate>Sun, 12 Oct 2008 12:46:17 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2404" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un &lt;a href="http://blogs.aspitalia.com/az/post2368/sp-linq-entity-framework-scrittura.aspx"&gt;blog&lt;/a&gt; di qualche tempo fa avevo messo a confronto le prestazioni tra &lt;em&gt;Linq&lt;/em&gt; e l'&lt;em&gt;Entity Framework&lt;/em&gt; in scrittura (e lettura). Anche in questo caso moltissime persone (una) mi hanno chiesto come si comportasse &lt;em&gt;Nhibernate&lt;/em&gt; nel confronto.&lt;/p&gt; &lt;p&gt;Innanzitutto, prima di sentenziare verità assolute che non possiedo, premetto che NON sono affatto un esperto di &lt;em&gt;Nhibernate&lt;/em&gt;: con esso ho solo &lt;em&gt;giocato&lt;/em&gt; in piccole applicazioni di test per testare le prestazioni di questo famoso e ottimo &lt;em&gt;ORM&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Per evitare discussioni riposto la struttura del database e i file di configurazione utilizzati nel mio test, in modo che gente più esperta di me di questo &lt;em&gt;ORM&lt;/em&gt;, possa segnalarmi eventuali errori:&lt;/p&gt; &lt;p&gt;&lt;img alt="struttura tabelle" src="http://blogs.aspitalia.com/img/andrewz/spvslinqvsentityframeworkinscrittura_141e2/image_1.png" /&gt;&lt;/p&gt; &lt;p&gt;Ed ecco i file di mapping usati per Nhibernate. Per la tabella &lt;em&gt;Padri&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&lt;br /&gt; assembly="EntitiesX"&lt;br /&gt; namespace="EntitiesX"&lt;br /&gt; default-lazy="false"&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;class name="Padri" table="Padri"&amp;gt;&lt;br /&gt; &amp;lt;id name="Id" unsaved-value="0" &amp;gt;&lt;br /&gt; &amp;lt;generator /&amp;gt;&lt;br /&gt; &amp;lt;/id&amp;gt; &lt;br /&gt; &amp;lt;property name="NomePadre" /&amp;gt; &lt;br /&gt; &amp;lt;bag name="Figli" cascade="all-delete-orphan"&lt;br /&gt; generic="true" lazy="false" inverse="true"&lt;br /&gt; fetch="join"&amp;gt;&lt;br /&gt; &amp;lt;key column="IdPadre" /&amp;gt;&lt;br /&gt; &amp;lt;one-to-many /&amp;gt;&lt;br /&gt; &amp;lt;/bag&amp;gt;&lt;br /&gt; &amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/em&gt; &lt;p&gt;Per la tabella &lt;em&gt;Figli&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"&lt;br /&gt; assembly="EntitiesX"&lt;br /&gt; namespace="EntitiesX"&lt;br /&gt; default-lazy="false"&lt;br /&gt; &amp;gt;&lt;br /&gt; &amp;lt;class name="Figli" table="Figli"&amp;gt;&lt;br /&gt; &amp;lt;id name="Id" unsaved-value="0" &amp;gt;&lt;br /&gt; &amp;lt;generator /&amp;gt;&lt;br /&gt; &amp;lt;/id&amp;gt; &lt;br /&gt; &amp;lt;property name="NomeFiglio" /&amp;gt;&lt;br /&gt; &amp;lt;many-to-one name="Padri" column="IdPadre" /&amp;gt;&lt;br /&gt; &amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;/em&gt; &lt;p&gt;Per l'inserimento ho usato questo banale codice:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (ISession session =sessionFactory.OpenSession() )&lt;br /&gt;{&lt;br /&gt; foreach (var padre in coll) session.SaveOrUpdate(padre);&lt;br /&gt; session.Flush();&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Come nel blog precedente, innanzitutto sono state create cento &lt;em&gt;entity Padri&lt;/em&gt;, con ognuna di essa cento &lt;em&gt;entity Figli&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;Ecco la tabella prestazionale definitiva (rifatta con il carico attuale del computer):&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="500" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td  width="125"&gt;&lt;strong&gt;Stored procedure&lt;/strong&gt;&lt;/td&gt; &lt;td  width="125"&gt;&lt;strong&gt;Linq To Sql&lt;/strong&gt;&lt;/td&gt; &lt;td  width="125"&gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt; &lt;td  width="125"&gt;&lt;strong&gt;Nhibernate&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td  width="125"&gt;6.85s&lt;/td&gt; &lt;td  width="125"&gt;24,10&lt;/td&gt; &lt;td  width="125"&gt;14,68&lt;/td&gt; &lt;td  width="125"&gt;13,87&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;Nhibernate, dall'alto dei suoi anni di sviluppo, batte entrambe le tecnologie Microsoft anche se di poco.&lt;/p&gt; &lt;p&gt;Ora vediamo come si portano tutti in lettura. Il codice ripopola tutti gli oggetti con il contenuto delle tabelle. Nel caso di &lt;em&gt;Nhibernate&lt;/em&gt;, il codice è il seguente:&lt;/p&gt; &lt;p&gt;&lt;em&gt;using (ISession session = sessionFactory.OpenSession())&lt;br /&gt;{&lt;br /&gt; IList&amp;lt;EntitiesX.Padri&amp;gt; coll=session.CreateCriteria(typeof(EntitiesX.Padri)).List&amp;lt;EntitiesX.Padri&amp;gt;();&lt;br /&gt; // Check collections&lt;br /&gt;} &lt;/em&gt; &lt;p&gt;Ed ecco i risultati:&lt;/p&gt; &lt;table cellspacing="0" cellpadding="2" width="400" border="1" unselectable="on"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td &gt;&lt;strong&gt;Linq To Sql&lt;/strong&gt;&lt;/td&gt; &lt;td &gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/td&gt; &lt;td &gt;&lt;strong&gt;Nhibernate&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td &gt;0,31s&lt;/td&gt; &lt;td &gt;0,91s&lt;/td&gt; &lt;td &gt;0,65s&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;L'&lt;em&gt;Entity Framework&lt;/em&gt; ne ha da strada da fare sul suo diretto e storico rivale...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ_to_SQL/" rel="tag"&gt;LINQ to SQL&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/NHibernate/" rel="tag"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx"&gt;&lt;em&gt;Un po&amp;#39; di benchmark tra Linq, Entity Framework e Nhibernate&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, .NET Framework, .NET Framework 3.5, Entity Framework, LINQ to SQL, NHibernate, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2404/Podi-Benchmark-Linq-Entity-Framework-Nhibernate.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2404.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2404</trackback:ping></item><item><title>UrlRewriting con trabocchetti vari</title><link>http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx</link><pubDate>Tue, 11 Dec 2007 20:05:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2181" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Mi sono preso un paio di giorni per sistemare il mio &lt;a title="IL MIO SITO!!!" href="http://ciclismo.sitiasp.it/"&gt;sito&lt;/a&gt;. A parte la sporcizia di codice che lo ha sempre contraddistinto (all'interno è codice in VB del 2002) e che ho in parte ripulito, ho implementato un url rewriting per migliorare l'indicizzazione da parte dei motori di ricerca.&lt;/p&gt;&lt;p&gt;Visto che è il mio quel sito, e visto che è sempre stata la mia palestra per l'asp.net, ho provato vari modi per la sua implementazione. Inizialmente avevo posto la mia attenzione all'uso degli handler come avevo spiegato &lt;a title="Usag 621" href="http://www.aspitalia.com/liste/usag/script.aspx?ID=621"&gt;qui&lt;/a&gt; nel lontano luglio del 2004, tecnica che trovo descritta anche attualmente in molti blog. Ma mi sono dovuto ricredere dopo i primi rilasci in beta per dei rallentamenti iniziali che non mi spiegavo. Dopo aver studiato per bene il funzionamento di tale tecnica con la mia web application, ho dovuto prendere la decisione di rinunciare, perché sì questa tenica risolve molti problemi, come il cambio di nome per i postback e necessità simili, ma creava un lavoro al server supplementare del tutto inutile.&lt;/p&gt;&lt;p&gt;L'uso di quel tipo di handler prende in consegna al richiesta e la ricompila con il nome della nuova pagina, e questo creava tanti file compilati nella cache di asp.net, quante erano le pagine elaborate con tale tecnica. Riprendendo l'esempio con quello script, io facevo in modo che un link di questo tipo:&lt;br /&gt;www.nomesito.xxx/articolo.aspx?codice=001&lt;/p&gt;&lt;p&gt;Potesse venire invocato con questo url:&lt;br /&gt;www.nomesito.xxx/articolo001.aspx&lt;/p&gt;&lt;p&gt;Il problema è dato dal fatto che ogni singolo articolo così specificato crea nella cache di asp.net una pagina compilata a sé, e per ogni articolo richiesto c'è un periodo di latenza dovuta alla nuova compilazione. Lo scenario diventa apocalittico se, nel mio caso e per il sito, gli articoli fossero stati un milione e fosse molto trafficato e tutti sarebbero richiesti. Nella cache di asp.net si sarebbero creati, per assurdo e solo teoricamente, 1.000.000 di file!&lt;/p&gt;&lt;p&gt;Ho deciso così di risolvere in un altro modo più semplice e prestazionale. In rete sono disponibili gratuitamente due componenti che fanno questo lavoro egregiamente lasciando perdere quello introdotto di asp.net 2.0 che è molto limitato. Io ho preso in considerazione:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a title="Link esterno" href="http://www.urlrewriting.net/en/Default.aspx"&gt;UrlRewritingNet&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="Link esterno" href="http://www.pluralsight.com/blogs/fritz/archive/2004/07/21/1651.aspx"&gt;Redirect module&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Entrambi hanno funzioni complete, come l'uso del codice http 301 per i trasferimenti di pagina e così via. Alla fine la mia decisione è caduta sul primo, ma solo per casualità.&lt;/p&gt;&lt;p&gt;In ogni caso, attenzione all'handler e al PageParser.GetCompiledPageIstance e a come viene utilizzato. Nel mio caso era un danno.&lt;/p&gt;&lt;p&gt;Tra due giorni è Santa Lucia.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/HttpHandler/" rel="tag"&gt;HttpHandler&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx"&gt;&lt;em&gt;UrlRewriting con trabocchetti vari&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, .NET Framework, .NET Framework 2.0, ASP.NET, HttpHandler</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx</guid><slash:comments>4</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2181/UrlRewriting-Trabocchetti-Vari.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2181.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2181</trackback:ping></item><item><title>Windows Forms - DataGridView e validazione</title><link>http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx</link><pubDate>Sun, 23 Sep 2007 18:08:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2132" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sto sistemando una piccola applicazione windows forms che ho scritto in C# per renderla più &lt;em&gt;umana&lt;/em&gt;. Ieri sera ho perso più di un'ora - due - per risolvere un problema con la validazione dei dati inseriti in un DataGridView. Tutto sembrava semplice all'inizio visto che è sufficiente agganciare all'evento &lt;em&gt;CellValidating&lt;/em&gt; il proprio codice per controllare il contenuto delle celle:&lt;/p&gt;&lt;code&gt;        private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            ...&lt;br /&gt;            if (e.ColumnIndex == 2)&lt;br /&gt;            {&lt;br /&gt;                int numero;&lt;br /&gt;                if (int.TryParse(e.FormattedValue.ToString(), out numero) == false)&lt;br /&gt;                {&lt;br /&gt;                    dataGridView1.Rows[e.RowIndex].ErrorText = &amp;quot;Inserire un valore numerico!&amp;quot;;&lt;br /&gt;                    e.Cancel = true;&lt;br /&gt;                }&lt;br /&gt;                else&lt;br /&gt;                {&lt;br /&gt;                    dataGridView1.Rows[e.RowIndex].ErrorText = null;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/code&gt;&lt;p&gt;Avviato l'esempio è tutto ok, nella cella prescelta posso inserire solo un valore numerico intero, altrimenti compare il &lt;em&gt;bollino&lt;/em&gt; rosso e l'errore specificato. Ma da qui inizia il patimento. Se, lasciato il contenuto errato in quella cella, qualsiasi altro webcontrol non risponde, neanche la chiusura della finestra. Penso che sia come per le web application: modifico la proprietà &amp;quot;Validating&amp;quot; dei singolo webcontrol all'infuori del DataGridView, ma nulla. Inizio a fare una ricerca su Internet, e trovo che è un problema comune e scopro qualche trucco per scavalcare il problema, ma non in modo soddisfacente.&lt;/p&gt;&lt;p&gt;Alla fine, testando, mettendo più idee insieme e tirando cazzotti alla tastiera ho trovato una buona soluzione. Innanzitutto è necessario disattivare la generazione di &lt;em&gt;exception&lt;/em&gt; in caso di inserimento di un dato errato nella cella. Aggiungiamo questo codice all'avento &lt;em&gt;DataError&lt;/em&gt; del &lt;em&gt;DataGridView&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            e.ThrowException = false;&lt;br /&gt;        }&lt;/code&gt;&lt;p&gt;Ora aggiungiamo quest'altro codice all'evento &lt;em&gt;Leave&lt;/em&gt;, che ci permette di ripristinare il contenuto della cella che era presente prima della nostra modifica o per inserire un valore di &lt;em&gt;default&lt;/em&gt; dato il tipo:&lt;/p&gt;&lt;code&gt;private void dataGridView1_Leave(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            for (int i = 0; i &amp;lt; dataGridView1.Rows.Count; i++)&lt;br /&gt;            {&lt;br /&gt;                for (int y = 0; y &amp;lt; dataGridView1.ColumnCount; y++)&lt;br /&gt;                {&lt;br /&gt;                    dataGridView1.Rows&lt;i&gt;.Cells[y].Value=&lt;br /&gt;                        dataGridView1.Rows&lt;i&gt;.Cells[y].GetEditedFormattedValue(i, DataGridViewDataErrorContexts.Commit);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;/code&gt;&lt;p&gt;Infine, per permettere la chiusura della finestra senza comunicazioni alcune, aggiungiamo questo codice all'evento &lt;em&gt;FormClosing&lt;/em&gt; della nostra &lt;em&gt;form&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;private void Principale_FormClosing(object sender, FormClosingEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            e.Cancel = false;&lt;br /&gt;        }&lt;/code&gt;&lt;p&gt;Fine.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx"&gt;&lt;em&gt;Windows Forms - DataGridView e validazione&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, .NET Framework, .NET Framework 2.0, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2132/Windows-Forms-DataGridView-Validazione.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2132.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2132</trackback:ping></item><item><title>ControlParameter e masterpage... bug?</title><link>http://blogs.aspitalia.com/az/post1892/ControlParameter-Masterpage.-Bug.aspx</link><pubDate>Sat, 23 Dec 2006 15:20:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1892" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Proprio ieri è apparso un &lt;a title="forum aspitalia" href="http://forum.aspitalia.com/forum/topic.aspx?postid=281867"&gt;messaggio&lt;/a&gt; sul forum in cui veniva segnalato uno strano problema riguardante i &lt;em&gt;controlparameter&lt;/em&gt; nelle masterpage. Ricordando che parecchio tempo fa mi era capitato di osservare lo stesso problema, ricordavo che avevo risolto con la costruzione di un controlparameter personalizzato.&lt;/p&gt;&lt;p&gt;Ma partiamo con ordine. Il bug si mostra nel caso nella pagina sono presenti due o più &lt;em&gt;contentplaceholder&lt;/em&gt; in cui il datasource e il controllo che dev'essere utilizzato per la query non sono nello stesso &lt;em&gt;contentplaceholder&lt;/em&gt;. Per esempio:&lt;/p&gt;&lt;code&gt;&amp;lt;asp:Content ID=&amp;quot;Content1&amp;quot; ContentPlaceHolderID=&amp;quot;ContentPlaceHolder1&amp;quot; Runat=&amp;quot;Server&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;asp:TextBox ID=&amp;quot;TextBox1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;aa001&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;&amp;lt;/asp:Content&amp;gt;&lt;br /&gt;&amp;lt;asp:Content ID=&amp;quot;Content2&amp;quot; ContentPlaceHolderID=&amp;quot;ContentPlaceHolder2&amp;quot; Runat=&amp;quot;Server&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;asp:GridView ID=&amp;quot;GridView1&amp;quot; runat=&amp;quot;server&amp;quot; AutoGenerateColumns=&amp;quot;true&amp;quot; DataKeyNames=&amp;quot;id&amp;quot;&lt;br /&gt;DataSourceID=&amp;quot;AccessDataSource1&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;asp:AccessDataSource ID=&amp;quot;AccessDataSource1&amp;quot; runat=&amp;quot;server&amp;quot; DataFile=&amp;quot;~/esempio.mdb&amp;quot;&lt;br /&gt;SelectCommand=&amp;quot;SELECT * FROM [tabella] WHERE ([nome] = ?)&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;SelectParameters&amp;gt;&lt;br /&gt;&amp;lt;asp:ControlParameter ControlID=&amp;quot;TextBox1&amp;quot; Name=&amp;quot;nome&amp;quot; PropertyName=&amp;quot;Text&amp;quot; Type=&amp;quot;String&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/SelectParameters&amp;gt;&lt;br /&gt;&amp;lt;/asp:AccessDataSource&amp;gt;&lt;br /&gt;&amp;lt;/asp:Content&amp;gt;&lt;/code&gt;&lt;p&gt;Una volta richiamata una pagina contenente questo codice, sarà visualizzato un errore perché il webcontrol &lt;em&gt;TextBox1&lt;/em&gt; dichiarato come &lt;em&gt;controlparameter&lt;/em&gt; non viene trovato anche se, come si vede, è ben visibile.&lt;/p&gt;&lt;p&gt;Andando a spulciare con il reflector il codice di &lt;em&gt;ControlParameter&lt;/em&gt;, vedo il problema nella funzione &lt;em&gt;FindControl&lt;/em&gt; nella classe interna &lt;em&gt;DataBoundControlHelper&lt;/em&gt;, funzione richiamata da ControlParameter per avere l'istanza del controllo interessato. Ecco il codice:&lt;/p&gt;&lt;code&gt;public static Control FindControl(Control control, string controlID)&lt;br /&gt;{&lt;br /&gt;Control control1 = control;&lt;br /&gt;Control control2 = null;&lt;br /&gt;if (control == control.Page)&lt;br /&gt;{&lt;br /&gt;return control.FindControl(controlID);&lt;br /&gt;}&lt;br /&gt;while ((control2 == null) &amp;amp;&amp;amp; (control1 != control.Page))&lt;br /&gt;{&lt;br /&gt;control1 = control1.NamingContainer;&lt;br /&gt;if (control1 == null)&lt;br /&gt;{&lt;br /&gt;throw new HttpException(SR.GetString(&amp;quot;DataBoundControlHelper_NoNamingContainer&amp;quot;, new object[] { control.GetType().Name, control.ID }));&lt;br /&gt;}&lt;br /&gt;control2 = control1.FindControl(controlID);&lt;br /&gt;}&lt;br /&gt;return control2;&lt;br /&gt;}&lt;/code&gt; &lt;p&gt;Viene cercarto il controllo per il suo ID, se non viene trovato si risale gerarchicamente la struttura dei controlli della pagina fino a livello di pagina. Ma il problema nel caso visualizzato sopra, dove sta? Nella costruzione della pagina per ogni content viene creato un &lt;em&gt;contentplaceholder&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;Page&lt;br /&gt;-&amp;gt;ContentPlaceHolder1&lt;br /&gt;--&amp;gt;TextBox1&lt;br /&gt;-&amp;gt;ContentPlaceHolder2&lt;br /&gt;--&amp;gt;ControlParameter&lt;/code&gt; &lt;p&gt;Come si può vedere il controllo &lt;em&gt;TextBox1&lt;/em&gt; è all'interno di un altro &lt;em&gt;Content&lt;/em&gt;, e nella routine qui sopra, risaliti a livello di &lt;em&gt;Page&lt;/em&gt; nella ricerca, non è possibile trovare &lt;em&gt;TextBox1&lt;/em&gt; perché è all'interno di un altro controllo. Per risolvere mi ero creato un controlparameter personalizzato in grado di cercare in modo più approfondito nei meandri della struttura gerarchica dei controlli:&lt;/p&gt;&lt;code&gt;using System;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Data;&lt;br /&gt;using System.Configuration;&lt;br /&gt;using System.Web;&lt;br /&gt;using System.Web.Security;&lt;br /&gt;using System.Web.UI;&lt;br /&gt;using System.Web.UI.WebControls;&lt;br /&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;using System.Web.UI.HtmlControls; &lt;br /&gt;&lt;br /&gt;/// &lt;summary /&gt;&lt;br /&gt;/// ControlParameter per masterpage&lt;br /&gt;/// &lt;/summary /&gt;&lt;br /&gt;namespace aspitalia.com&lt;br /&gt;{&lt;br /&gt;public class ControlParameterMP : ControlParameter&lt;br /&gt;{&lt;br /&gt;protected override object Evaluate(HttpContext context, Control control)&lt;br /&gt;{&lt;br /&gt;if (control == null)&lt;br /&gt;{&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;string text1 = this.ControlID;&lt;br /&gt;string text2 = this.PropertyName;&lt;br /&gt;if (text1.Length == 0)&lt;br /&gt;{&lt;br /&gt;throw new ArgumentException(&amp;quot;ControlParameter_ControlIDNotSpecified&amp;quot;);&lt;br /&gt;}&lt;br /&gt;Control control1 = this.FindControl(control, text1);&lt;br /&gt;if (control1 == null)&lt;br /&gt;{&lt;br /&gt;throw new InvalidOperationException(&amp;quot;ControlParameter_CouldNotFindControl&amp;quot;);&lt;br /&gt;}&lt;br /&gt;ControlValuePropertyAttribute attribute1 = (ControlValuePropertyAttribute)TypeDescriptor.GetAttributes(control1)[typeof(ControlValuePropertyAttribute)];&lt;br /&gt;if (text2.Length == 0)&lt;br /&gt;{&lt;br /&gt;if ((attribute1 == null) || string.IsNullOrEmpty(attribute1.Name))&lt;br /&gt;{&lt;br /&gt;throw new InvalidOperationException(&amp;quot;ControlParameter_PropertyNameNotSpecified&amp;quot;);&lt;br /&gt;}&lt;br /&gt;text2 = attribute1.Name;&lt;br /&gt;}&lt;br /&gt;object obj1 = DataBinder.Eval(control1, text2);&lt;br /&gt;if (((attribute1 != null) &amp;amp;&amp;amp; string.Equals(attribute1.Name, text2, StringComparison.OrdinalIgnoreCase)) &amp;amp;&amp;amp; ((attribute1.DefaultValue != null) &amp;amp;&amp;amp; attribute1.DefaultValue.Equals(obj1)))&lt;br /&gt;{&lt;br /&gt;return null;&lt;br /&gt;}&lt;br /&gt;return obj1;&lt;br /&gt;}&lt;br /&gt;//&lt;br /&gt;// Codice per la ricerca del controllo&lt;br /&gt;//&lt;br /&gt;private Control FindControl(Control control, string controlID)&lt;br /&gt;{&lt;br /&gt;Control control1 = control;&lt;br /&gt;Control control2 = null;&lt;br /&gt;if (control == control.Page)&lt;br /&gt;{&lt;br /&gt;return control.FindControl(controlID);&lt;br /&gt;}&lt;br /&gt;while (control2 == null)&lt;br /&gt;{&lt;br /&gt;control1 = control1.Parent;&lt;br /&gt;if (control1 == null)&lt;br /&gt;{&lt;br /&gt;throw new HttpException(&amp;quot;DataBoundControlHelper_NoNamingContainer&amp;quot;);&lt;br /&gt;}&lt;br /&gt;control2 = control1.FindControl(controlID);&lt;br /&gt;if (control2 != null) break;&lt;br /&gt;foreach (Control cc in control1.Controls)&lt;br /&gt;{&lt;br /&gt;ContentPlaceHolder ph = cc as ContentPlaceHolder;&lt;br /&gt;if (ph != null)&lt;br /&gt;{&lt;br /&gt;control2=ph.FindControl(controlID);&lt;br /&gt;if (control2 != null) break;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if (control1 == control.Page) break;&lt;br /&gt;}&lt;br /&gt;return control2;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;E' possibile inserirlo direttamente nella directory &lt;em&gt;code&lt;/em&gt; della webapplication, in tal caso, per usarlo nelle nostre pagine dovremo registrarlo nell'intestazione di pagina:&lt;/p&gt;&lt;code&gt;&amp;lt;%@ Register TagPrefix=&amp;quot;az&amp;quot; Namespace=&amp;quot;aspitalia.com&amp;quot; Assembly=&amp;quot;__code&amp;quot; %&amp;gt;&lt;/code&gt;&lt;p&gt;E per utilizzarlo nell'esempio sopra:&lt;/p&gt;&lt;code&gt;&amp;lt;asp:AccessDataSource ID=&amp;quot;AccessDataSource1&amp;quot; runat=&amp;quot;server&amp;quot; DataFile=&amp;quot;~/articoli.mdb&amp;quot;&lt;br /&gt;SelectCommand=&amp;quot;SELECT * FROM [table] WHERE ([nome] = ?)&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;SelectParameters&amp;gt;&lt;br /&gt;&amp;lt;az:ControlParameterMP ControlID=&amp;quot;TextBox1&amp;quot; Name=&amp;quot;nome&amp;quot; PropertyName=&amp;quot;Text&amp;quot; Type=&amp;quot;String&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/SelectParameters&amp;gt;&lt;br /&gt;&amp;lt;/asp:AccessDataSource&amp;gt;&lt;/code&gt;&lt;p&gt;Non sono sicuro che sia la tecnica migliore, ma se esiste una strada più veloce...&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1892/ControlParameter-Masterpage.-Bug.aspx"&gt;&lt;em&gt;ControlParameter e masterpage... bug?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1892/ControlParameter-Masterpage.-Bug.aspx</guid><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1892/ControlParameter-Masterpage.-Bug.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1892.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1892</trackback:ping></item><item><title>Se Visual Studio 2005 non accetta pi&amp;#249; la tastiera</title><link>http://blogs.aspitalia.com/az/post1886/Visual-Studio-2005-Accetta-Tastiera.aspx</link><pubDate>Sat, 16 Dec 2006 19:45:34 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1886" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Tempo fa il mio VS2005 aveva avuto improvvisamente un ripensamento sulle mie reali capacità di programmazione e di punto in bianco aveva smesso di accettare l'input da tastiera. Sì, nella finestra di codice non accettava più codice, singole parole, singoli caratteri: solo i controlli via mouse funziovano ancora; inizialmente avevo ricordato le parole al lancio di VS2005 quando dissero che non sarebbe più stato necessario scrivere codice, e quello era un trucco per spingere l'utente ad usare solo i wizard! Dopo l'assurdità di questo pensiero avevo cominciato a pensare ad un problema della tastiera; rapido tentativo se fosse ok con dei pugni ben assestati ma vedevo che ancora nell'editor di VS2005 nulla appariva. Solo infine decido di aprire Office Word Beta 1, e lui sì che accettava i caratteri senza battere ciglio.&lt;/p&gt; &lt;p&gt;Ma come, con una beta di Word funziona la tastiera (e non crasha neanche il correttore ortografico) e con la versione finale di VS2005 non posso più scrivere codice?&lt;/p&gt; &lt;p&gt;Passo finale, cerco su Internet, sembra che io sia il solo ad avere quel problema. Ma ecco che finalmente trovo la &lt;a title="link esterno" href="http://groups.google.com/group/microsoft.public.vsnet.enterprise.tools/browse_thread/thread/f97590e6ff5819a5/5ab484865e7b8add?lnk=st&amp;amp;rnum=2#5ab484865e7b8add"&gt;soluzione&lt;/a&gt;. Nel mio caso è stato sufficiente cancellare i file "User.vsk" e "Default.vsk" nella directory: "C:\Documents and Settings\[nome utente]\Dati applicazioni\Microsoft\VisualStudio\8.0".&lt;/p&gt; &lt;p&gt;Forse può essere utile ad altri se mai dovessi capitare...&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1886/Visual-Studio-2005-Accetta-Tastiera.aspx"&gt;&lt;em&gt;Se Visual Studio 2005 non accetta pi&amp;amp;ugrave; la tastiera&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1886/Visual-Studio-2005-Accetta-Tastiera.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1886/Visual-Studio-2005-Accetta-Tastiera.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1886.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1886</trackback:ping></item><item><title>Service Pack 1 di Visual Studio 2005</title><link>http://blogs.aspitalia.com/az/post1885/Service-Pack-Visual-Studio-2005.aspx</link><pubDate>Sat, 16 Dec 2006 19:35:03 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1885" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Letto e riletto che è disponibile il &lt;a title="link esterno" href="http://msdn.microsoft.com/vstudio/support/vs2005sp1/"&gt;service pack per Visual studio&lt;/a&gt; ecco che corro a scaricarlo (450MB!!!) e ad installarlo. Un mio consiglio personale: farlo solo quando si è sicuri che non si dovrà usare il computer per almeno un paio d'ore:&lt;/p&gt; &lt;p&gt;&lt;img height="512" alt="aggiornamento service pack 1 di visual studio 2005" src="http://blogs.aspitalia.com/img/andrewz/servicepack1divisualstudio2005_12149/aggiornamento%5b3%5d.gif" width="402" /&gt; &lt;/p&gt; &lt;p&gt;Ed io che cercavo anche di fare altro... ma cosa cerca e legge su disco per un'ora con CPU quasi sempre al 100%?&lt;/p&gt; &lt;p&gt;Leggo ora che &lt;a title="link esterno" href="http://blogs.ugidotnet.org/rgm/archive/2006/12/16/59799.aspx"&gt;altri&lt;/a&gt; hanno avuto il mio stesso problema! :(&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1885/Service-Pack-Visual-Studio-2005.aspx"&gt;&lt;em&gt;Service Pack 1 di Visual Studio 2005&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1885/Service-Pack-Visual-Studio-2005.aspx</guid><slash:comments>6</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1885/Service-Pack-Visual-Studio-2005.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1885.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1885</trackback:ping></item><item><title>Class viewer per .net scritta con ajax</title><link>http://blogs.aspitalia.com/az/post1862/Class-Viewer-.net-Scritta-Ajax.aspx</link><pubDate>Mon, 27 Nov 2006 23:10:43 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1862" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/leftslipper/default.aspx"&gt;Eilon Lipton&lt;/a&gt; - quello del tè? - ha scritto un'applicazione carina con ajax che permette di vedere le classi del framework da un'applicazione web. Simpatico &lt;a href="http://weblogs.asp.net/leftslipper/archive/2006/11/21/asp.net-ajax-javascript-class-browser.aspx"&gt;lavoro&lt;/a&gt; anche per saperne di più dei meandri del .net ;)&lt;/p&gt; &lt;h6&gt;&lt;em&gt;Non è tardissimo, ma non riesco a dormire...&lt;/em&gt;&lt;/h6&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/AJAX/" rel="tag"&gt;AJAX&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_AJAX/" rel="tag"&gt;ASP.NET AJAX&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1862/Class-Viewer-.net-Scritta-Ajax.aspx"&gt;&lt;em&gt;Class viewer per .net scritta con ajax&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, AJAX, ASP.NET, ASP.NET 2.0, ASP.NET AJAX</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1862/Class-Viewer-.net-Scritta-Ajax.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1862/Class-Viewer-.net-Scritta-Ajax.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1862.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1862</trackback:ping></item><item><title>Validator e richcontrol</title><link>http://blogs.aspitalia.com/az/post1598/Validator-Richcontrol.aspx</link><pubDate>Sat, 20 May 2006 11:22:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1598" border="0" style="width:1px; height:1px;" /&gt;Disponibile gratuitamente il capitolo 8 del libro Beginning asp.net 2.0 in formato PDF a questo &lt;a title="Link esterno" href="http://www.apress.com/ApressCorporate/supplement/1/10035/1590595726-3286.pdf"&gt;link&lt;/a&gt;. Tratta i validator e i richcontrol. Utile.&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1598/Validator-Richcontrol.aspx"&gt;&lt;em&gt;Validator e richcontrol&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, ASP.NET, ASP.NET 2.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1598/Validator-Richcontrol.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1598/Validator-Richcontrol.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1598.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1598</trackback:ping></item><item><title>Configurare (e utilizzare) il provider Access in asp.net 2.0</title><link>http://blogs.aspitalia.com/az/post1510/Configurare-E-Utilizzare-Provider-Access-Asp.net-2.0.aspx</link><pubDate>Sun, 12 Mar 2006 19:19:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1510" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Mi è capitato di leggere nei forum, in alcune occasioni, problemi di installazione e nell'uso del provider Access rilasciato da Microsoft nelle proprie applicazione asp.net.&lt;/p&gt;&lt;p&gt;In effetti la scelta di creare un pacchetto che crea un template in Visual Studio 2005 è discutibile. Ottima per creare nuovi progetti ma pessima nei casi in cui si voglia utilizzare in progetti già esistenti, soprattutto per i neofiti.&lt;/p&gt;&lt;p&gt;Per utilizzare il provider in questione nei propri progetti sono sufficienti poche azioni. Innanzitutto è necessario andare nella directory dove l'installer del &lt;a title="Download Access provider" href="http://msdn.microsoft.com/vstudio/eula.aspx?id=96713a8e-b8d4-4d6e-bb8f-027e6c8e15d8"&gt;provider&lt;/a&gt; ha inserito il file zippato del template. Solitamente in un percorso di questo tipo:&lt;/p&gt;&lt;p&gt;&amp;quot;C:\Visual Studio 2005\Templates\ProjectTemplates\Visual Web Developer\Starter Kits&amp;quot;&lt;/p&gt;&lt;p&gt;Il file è in questione ha il nome &amp;quot;ASP.NET Access Providers.zip&amp;quot;. Possiamo decomprimerlo in una qualsiasi directory di nostro gusto.&lt;/p&gt;&lt;p&gt;In alternativa è possibile creare un nuovo progetto direttamente da VS 2005 con questo template.&lt;/p&gt;&lt;p&gt;In entrambi i casi ora ci serve una versione compilata del provider. Per la compilazione è sufficiente caricare da Visual Studio il progetto, quindi compilare il tutto in release mode. Ok, ora nella directory &amp;quot;bin/Release&amp;quot; sarà presente la .dll da utilizzare nei propri progetti insieme ad altri file. Quelli di nostro interesse sono:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SampleAccessProviders.dll&lt;/li&gt;&lt;li&gt;ASPNetDB.mdb&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Il primo è la dll da copiare nella directory bin della web application in cui vogliamo utilizzare il provider Access, il secondo è il database Access che dovremo copiare nella directory &amp;quot;App_Data&amp;quot;.&lt;/p&gt;&lt;p&gt;Ora è sufficiente il tutto nel web.config della nostra web application:&lt;/p&gt;&lt;code&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;connectionStrings&amp;gt;&lt;br /&gt;    &amp;lt;add name=&amp;quot;AccessFileName&amp;quot; connectionString=&amp;quot;~/App_Data/ASPNetDB.mdb&amp;quot; providerName=&amp;quot;System.Data.OleDb&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/connectionStrings&amp;gt;&lt;br /&gt; &amp;lt;system.web&amp;gt;&lt;br /&gt;  &amp;lt;membership defaultProvider=&amp;quot;AccessMembershipProvider&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;providers&amp;gt;&lt;br /&gt;        &amp;lt;add name=&amp;quot;AccessMembershipProvider&amp;quot; &lt;br /&gt;     type=&amp;quot;Samples.AccessProviders.AccessMembershipProvider&amp;quot; &lt;br /&gt;     connectionStringName=&amp;quot;AccessFileName&amp;quot; &lt;br /&gt;     enablePasswordRetrieval=&amp;quot;false&amp;quot; &lt;br /&gt;     enablePasswordReset=&amp;quot;false&amp;quot; &lt;br /&gt;     requiresUniqueEmail=&amp;quot;false&amp;quot; &lt;br /&gt;     requiresQuestionAndAnswer=&amp;quot;false&amp;quot; &lt;br /&gt;     minRequiredPasswordLength=&amp;quot;1&amp;quot; &lt;br /&gt;     minRequiredNonalphanumericCharacters=&amp;quot;0&amp;quot; &lt;br /&gt;     applicationName=&amp;quot;SampleSite&amp;quot; &lt;br /&gt;     hashAlgorithmType=&amp;quot;SHA1&amp;quot; &lt;br /&gt;     passwordFormat=&amp;quot;Hashed&amp;quot; /&amp;gt;&lt;br /&gt;      &amp;lt;/providers&amp;gt;&lt;br /&gt;  &amp;lt;/membership&amp;gt;&lt;br /&gt;  &amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;p&gt;Spero che questo brevissimo tutorial possa servire a qualcuno.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Membership_API/" rel="tag"&gt;Membership API&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Provider_Model/" rel="tag"&gt;Provider Model&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1510/Configurare-E-Utilizzare-Provider-Access-Asp.net-2.0.aspx"&gt;&lt;em&gt;Configurare (e utilizzare) il provider Access in asp.net 2.0&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, Architettura, ASP.NET, ASP.NET 2.0, Membership API, Provider Model</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1510/Configurare-E-Utilizzare-Provider-Access-Asp.net-2.0.aspx</guid><slash:comments>33</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1510/Configurare-E-Utilizzare-Provider-Access-Asp.net-2.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1510.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1510</trackback:ping></item><item><title>Encoding del GridView</title><link>http://blogs.aspitalia.com/az/post1463/Encoding-GridView.aspx</link><pubDate>Fri, 10 Feb 2006 08:01:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1463" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sono ancora vivo.&lt;/p&gt;&lt;p&gt;In un newsgroup è stato posto un interessante quesito riguardante il GridView. Una volta selezionata una riga con un button, e cercato di prendere il testo inserito in una cella di quella riga per inserirla in una textbox, il testo lì visualizzato, in caso di presenza di vocali accentate o altri 'strani' simboli, viene inserito come una sequenza escape. Il bello è che questa cosa con il classico DataGrid non avviene. Ad esempio, con questo codice:&lt;/p&gt;&lt;code&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;System.Data&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;    void Page_Load()&lt;br /&gt;    {&lt;br /&gt;        if (Page.IsPostBack) return;&lt;br /&gt;        BindData();&lt;br /&gt;    }&lt;br /&gt;    void BindData()&lt;br /&gt;    {&lt;br /&gt;        DataTable dt = new DataTable();&lt;br /&gt;        DataColumn dc;&lt;br /&gt;        dc = new DataColumn(&amp;quot;id&amp;quot;, typeof(int));&lt;br /&gt;        dc.AutoIncrement = true;&lt;br /&gt;        dt.Columns.Add(dc);&lt;br /&gt;        dc = new DataColumn(&amp;quot;a1&amp;quot;, typeof(string));&lt;br /&gt;        dt.Columns.Add(dc);&lt;br /&gt;        dc = new DataColumn(&amp;quot;a2&amp;quot;, typeof(string));&lt;br /&gt;        dt.Columns.Add(dc);&lt;br /&gt;        for (int i = 0; i &amp;lt; 10; i += 1)&lt;br /&gt;        {&lt;br /&gt;            DataRow dr = dt.NewRow();&lt;br /&gt;            dr[&amp;quot;a1&amp;quot;] = string.Format(&amp;quot;aaz {0}&amp;quot;, i);&lt;br /&gt;            dr[&amp;quot;a2&amp;quot;] = string.Format(&amp;quot;àèìòù {0}&amp;quot;, i);&lt;br /&gt;            dt.Rows.Add(dr);&lt;br /&gt;        }&lt;br /&gt;        DataGrid1.DataSource = dt;&lt;br /&gt;        DataGrid1.DataBind();&lt;br /&gt;    }&lt;br /&gt;    protected void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        DataGridItem row= DataGrid1.Items[e.Item.ItemIndex];&lt;br /&gt;        messaggio.Text = row.Cells[3].Text;&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&amp;quot;&lt;a href="http://www.w3.org/1999/xhtml"&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;&amp;quot; &amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;    &amp;lt;asp:DataGrid ID=&amp;quot;DataGrid1&amp;quot; DataKeyField=&amp;quot;id&amp;quot; runat=&amp;quot;server&amp;quot; OnItemCommand=&amp;quot;DataGrid1_ItemCommand&amp;quot; &amp;gt;&lt;br /&gt;        &amp;lt;Columns&amp;gt;&lt;br /&gt;            &amp;lt;asp:ButtonColumn Text=&amp;quot;Edit&amp;quot;&amp;gt;&amp;lt;/asp:ButtonColumn&amp;gt;&lt;br /&gt;        &amp;lt;/Columns&amp;gt;&lt;br /&gt;    &amp;lt;/asp:DataGrid&amp;gt;&lt;br /&gt;        Selezionata: &amp;lt;asp:TextBox id=&amp;quot;messaggio&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;p&gt;Una volta richiesta questa pagina sarà visualizzato il classico DataGrid, con quattro colonne. Cliccando sul buttonlink nel textbox viene inserito il testo dell'ultima colonna, e le vocali accentate appaiono correttamente. Ma se lo stesso codice lo convertissimo per l'uso del GridView avremo la sorpresa:&lt;/p&gt;&lt;p&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;System.Data&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;    void Page_Load()&lt;br /&gt;    {&lt;br /&gt;        if (Page.IsPostBack) return;&lt;br /&gt;        BindData();&lt;br /&gt;    }&lt;br /&gt;    void BindData()&lt;br /&gt;    {&lt;br /&gt;        DataTable dt = new DataTable();&lt;br /&gt;        DataColumn dc;&lt;br /&gt;        dc = new DataColumn(&amp;quot;id&amp;quot;, typeof(int));&lt;br /&gt;        dc.AutoIncrement = true;&lt;br /&gt;        dt.Columns.Add(dc);&lt;br /&gt;        dc = new DataColumn(&amp;quot;a1&amp;quot;, typeof(string));&lt;br /&gt;        dt.Columns.Add(dc);&lt;br /&gt;        dc = new DataColumn(&amp;quot;a2&amp;quot;, typeof(string));&lt;br /&gt;        dt.Columns.Add(dc);&lt;br /&gt;        for (int i = 0; i &amp;lt; 10; i += 1)&lt;br /&gt;        {&lt;br /&gt;            DataRow dr = dt.NewRow();&lt;br /&gt;            dr[&amp;quot;a1&amp;quot;] = string.Format(&amp;quot;aaz {0}&amp;quot;, i);&lt;br /&gt;            dr[&amp;quot;a2&amp;quot;] = string.Format(&amp;quot;àèìòù {0}&amp;quot;, i);&lt;br /&gt;            dt.Rows.Add(dr);&lt;br /&gt;        }&lt;br /&gt;        GridView1.DataSource = dt;&lt;br /&gt;        GridView1.DataBind();&lt;br /&gt;    }&lt;br /&gt;    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        GridViewRow row = GridView1.Rows[Convert.ToInt32(e.CommandArgument)];&lt;br /&gt;        messaggio.Text = row.Cells[3].Text;&lt;br /&gt;    }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&amp;quot;&lt;a href="http://www.w3.org/1999/xhtml"&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;&amp;quot; &amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;div&amp;gt;&lt;br /&gt;        &amp;lt;asp:GridView ID=&amp;quot;GridView1&amp;quot; runat=&amp;quot;server&amp;quot; DataKeyNames=&amp;quot;id&amp;quot; OnRowCommand=&amp;quot;GridView1_RowCommand&amp;quot;&amp;gt;&lt;br /&gt;            &amp;lt;Columns&amp;gt;&lt;br /&gt;                &amp;lt;asp:ButtonField Text=&amp;quot;Edit&amp;quot; /&amp;gt;&lt;br /&gt;            &amp;lt;/Columns&amp;gt;&lt;br /&gt;        &amp;lt;/asp:GridView&amp;gt;&lt;br /&gt;        Selezionata: &amp;lt;asp:TextBox id=&amp;quot;messaggio&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/code /&gt;&lt;/p&gt;&lt;p&gt;Cliccando sul linkbutton si visualizzerà, per esempio, la sequenza &amp;quot;&amp;amp;#224;&amp;amp;#232;&amp;amp;#236;&amp;amp;#242;&amp;amp;#249; 0&amp;quot;.&lt;/p&gt;&lt;p&gt;Per risolvere è sufficiente utilizzare un banale trucco:&lt;/p&gt;&lt;code&gt;    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)&lt;br /&gt;    {&lt;br /&gt;        GridViewRow row = GridView1.Rows[Convert.ToInt32(e.CommandArgument)];&lt;br /&gt;        messaggio.Text = HttpUtility.HtmlDecode(row.Cells[3].Text);&lt;br /&gt;    }&lt;/code&gt;&lt;p&gt;La spiegazione di questo, se non erro, sta nella classe BoudColumn che, nel momento della creazione della cella, esegue l'HtmlEncode del testo da visualizzare. Più precisamente nella funzione &amp;quot;OnDataBindField&amp;quot; che richiama la funzione &amp;quot;FormatDataValue&amp;quot; che esegue effettivamente la codifica.&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1463/Encoding-GridView.aspx"&gt;&lt;em&gt;Encoding del GridView&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1463/Encoding-GridView.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1463/Encoding-GridView.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1463.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1463</trackback:ping></item><item><title>Da una beta alla versione finale... cronaca di una disinstallazione selvaggia</title><link>http://blogs.aspitalia.com/az/post1323/Beta-Versione-Finale.-Cronaca-Disinstallazione-Selvaggia.aspx</link><pubDate>Sun, 30 Oct 2005 12:27:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1323" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sul mio pc non uso virtual machine. Dalle versioni alpha alle versioni finali... tutto è installato nella partizione del sistema operativo che uso sempre. Così anche per Visual Studio 2005 che è passato dalla prime versioni alpha a quella finale installata proprio ieri sera mentre pochi minuti prima della disfatta della Juve contro il Milan per 3 a 1.&lt;/p&gt;&lt;p&gt;L'&lt;a title="Link esterno" href="http://lab.msdn.microsoft.com/vs2005/uninstall/preRTMuninstall/default.aspx"&gt;ordine&lt;/a&gt; di disintallazione. Sbagli quello è sei finito. Violenza, calci, pugni allo &lt;em&gt;chassis&lt;/em&gt; del computer non servono a nulla. Imprecazioni nemmeno. Preghiere ai santi non servono: le preghiere per piccole cose sono ascoltate?&lt;/p&gt;&lt;p&gt;La sorpresa di trovarmi con la versione finale di sql server express, che viene installata insieme a Visual Studio 2005 Professional, non funzionante è ciò che mi è stato regalato ieri. L'ordine. Avevo sbagliato l'ordine di disinstallazione. Devo di nuovo disinstallare sql express, ma la sua voce da &amp;quot;Installazione applicazioni&amp;quot; non è più presente. Come risolvere? Inizio una ricerca su google dello stesso problema, e trovo un &lt;a title="Link esterno" href="http://blogs.msdn.com/astebner/archive/2005/09/13/465401.aspx"&gt;blog&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Innanzitutto è necessario scaricare il tool &lt;a title="Link per il download di msiinv.exe" href="http://www.huydao.net/setup/msiinv.zip"&gt;msiinv.exe&lt;/a&gt;. Questo permette la visualizzazione di tutto il software installato sulla propria macchina. Avviato dal prompt dei comandi con:&lt;/p&gt;&lt;code&gt;msiinv.exe &amp;gt;list.txt&lt;/code&gt;&lt;p&gt;Avremo nel file &amp;quot;list.txt&amp;quot; (di più facile consultazione) la lista del software installato. Dalla lista bsta prendere il &amp;quot;Product code&amp;quot; dedicato alle versione di software che vogliamo cancellare. Nel mio caso Sql Server Express Edition:&lt;/p&gt;&lt;code&gt;msiexec.exe /x {Product code}&lt;/code&gt;&lt;p&gt;Anche con questo codice ottengo un errore. Allora prendo il secondo &lt;a title="Tool per la disinstallazione del software" href="http://astebner.sts.winisp.net/Tools/dotnetfx_cleanup_tool.zip"&gt;tool&lt;/a&gt;. Non si deve avviare immediatamente, altrimenti vengono cancellati tutti i software riguardandi il Framework. Inzialmente di deve decomprimere con:&lt;/p&gt;&lt;code&gt;&lt;font face="Verdana" size="2"&gt;cleanup_tool.exe /t:c:\ /c&lt;/font&gt;&lt;/code&gt;&lt;p&gt;In &amp;quot;c:&amp;quot; avremo il file &amp;quot;msizap.exe&amp;quot;. Ok, provo questo:&lt;/p&gt;&lt;code&gt;msizap.exe TP {Product code}&lt;/code&gt;&lt;p&gt;Richiamo questo comando con tutto il software beta da cancellare, e finalmente Sql Express versione beta viene cancellata e mi è possibile installare la versione finale. Era ora. Tutto risolto, tranne il fatto che la Juve ha perso. Ma per questo non posso fare nulla.&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1323/Beta-Versione-Finale.-Cronaca-Disinstallazione-Selvaggia.aspx"&gt;&lt;em&gt;Da una beta alla versione finale... cronaca di una disinstallazione selvaggia&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1323/Beta-Versione-Finale.-Cronaca-Disinstallazione-Selvaggia.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1323/Beta-Versione-Finale.-Cronaca-Disinstallazione-Selvaggia.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1323.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1323</trackback:ping></item><item><title>XslTrasform mi &amp;#232; diventata XslCompiledTransform</title><link>http://blogs.aspitalia.com/az/post1286/XslTrasform-Diventata-XslCompiledTransform.aspx</link><pubDate>Tue, 11 Oct 2005 20:21:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1286" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Preso del mio vecchio codice. Copio in una pagina per asp.net 2.0. Il codice niente di complesso: una trasformazione di un file xml grazie all'xslt:&lt;/p&gt;&lt;p&gt;&lt;code&gt;string Trasforma(string xml_file, string xsl_file)&lt;br /&gt;{&lt;br /&gt;XmlDataDocument doc=new XmlDataDocument();&lt;br /&gt;doc.Load(Request.MapPath(xml_file);&lt;br /&gt;XslTransform xslt=new XslTransform();&lt;br /&gt;xslt.Load(Request.MapPath(xsl_file));&lt;br /&gt;StringBuilder sb=new StringBuilder();&lt;br /&gt;StringWriter sw=new StringWriter(sb);&lt;br /&gt;&lt;/code&gt;&lt;code&gt;XmlUrlResolver resolver = new XmlUrlResolver();&lt;br /&gt;xslt.Transform(doc,args,sw,resolver);&lt;br /&gt;sw.Close();&lt;br /&gt;return sb.ToString();&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Codice stupido: dati i due file ritorna la stringa con il risultato della trasformazione (è un pezzo di codice prelevato da un esempio reale). Ok, lo compilo con vs 2005 e sull'&lt;em&gt;XslTrasform&lt;/em&gt; ottengo che la classe è obsoleta e &lt;em&gt;deve&lt;/em&gt; essere utilizzata la nuova &lt;em&gt;XslCompiledTrasform&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Cerco di informarmi a riguardo, e trovo subito la documentazione completa a riguardo. &lt;a title="Link esterno" href="http://blogs.msdn.com/xmlteam/archive/2005/09/30/475922.aspx"&gt;Link&lt;/a&gt; interessante e ricco di informazioni. Ok, ma come diventa ora quel codice qui sopra? Eccolo:&lt;/p&gt;&lt;code&gt;string Trasforma(string xml_file, string xsl_file)&lt;br /&gt;{&lt;br /&gt;&lt;code&gt;XslCompiledTransform transform = new XslCompiledTransform();&lt;br /&gt;transform.Load(Request.MapPath(xsl_file));&lt;br /&gt;XmlWriterSettings ws = transform.OutputSettings.Clone();&lt;br /&gt;ws.CheckCharacters = false;&lt;br /&gt;StringBuilder sb = new StringBuilder();&lt;br /&gt;XmlWriter sw = XmlWriter.Create(sb,ws);&lt;br /&gt;transform.Transform(Request.MapPath(xml_file), sw);&lt;br /&gt;return sb.ToString();&lt;br /&gt;}&lt;/code&gt;&lt;/code&gt;&lt;p&gt;Anche se questo mi ha fatto incacchiare come un'ape (Cartman docet).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/XML/" rel="tag"&gt;XML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1286/XslTrasform-Diventata-XslCompiledTransform.aspx"&gt;&lt;em&gt;XslTrasform mi &amp;#232; diventata XslCompiledTransform&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, XML</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1286/XslTrasform-Diventata-XslCompiledTransform.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1286/XslTrasform-Diventata-XslCompiledTransform.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1286.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1286</trackback:ping></item><item><title>Debuggare javascript, utile per Ajax</title><link>http://blogs.aspitalia.com/az/post1282/Debuggare-Javascript-Utile-Ajax.aspx</link><pubDate>Tue, 11 Oct 2005 16:17:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1282" border="0" style="width:1px; height:1px;" /&gt;A questo link un &lt;a title="Link esterno" href="http://codechasers.blogs.com/codechasers/files/ajax_debugging.PDF"&gt;tutorial&lt;/a&gt; su una tecnica per poter fare il debug del codice javascript per Ajax.  &lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1282/Debuggare-Javascript-Utile-Ajax.aspx"&gt;&lt;em&gt;Debuggare javascript, utile per Ajax&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1282/Debuggare-Javascript-Utile-Ajax.aspx</guid><slash:comments>26</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1282/Debuggare-Javascript-Utile-Ajax.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1282.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1282</trackback:ping></item><item><title>webadmin.axd dalla beta 2 di asp.net 2.0... che fine ha fatto?</title><link>http://blogs.aspitalia.com/az/post1255/Webadmin.axd-Beta-Asp.net-2.0.-Fine-Fatto.aspx</link><pubDate>Mon, 26 Sep 2005 18:12:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1255" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sapendo che &lt;a title="Link esterno" href="http://www.dotnethell.it/"&gt;David&lt;/a&gt; partiva domani con la combriccola degli MVP per Seattle, e abitando a pochi chilometri da casa mia, sono passato a salutarlo. Forse sono uno degli esseri umani che ha avuto occasione di visitare lo &lt;em&gt;studio&lt;/em&gt; dove David realizza i suoi progetti, ed è come la media - penso - delle stanze adibite a computer... la confusione completa :-P&lt;/p&gt;&lt;p&gt;Scherzi a parte, parlando del più e del meno iniziamo la discussione sul nuovo .net 2.0. Proprio qualche giorno prima avevo provato su windows xp pro la versione beta 2, e avevo riscontrato una strenezza con lo strumento di amministrazione via web, il cosidetto &amp;quot;Web Site Administration Tool&amp;quot;. Fin dalla versione alpha, era sufficiente richiamare dal browser una pagina particolare (mappata con un handler) per vedere comparire un pannello di controllo del sito:&lt;/p&gt;&lt;p&gt;http://localhost/nome_sito/webadmin.axd&lt;/p&gt;&lt;p&gt;Sul mio computer con la beta 2 non veniva più richiamata l'applicazione web, ma funzionava correttamente se da Visual Studio 2005 si cliccava sulla piccola icona con il mondo e un martella nella solution explorer. Pensando al fatto che io testavo l'applicazione con windows xp ci fosse un malfunzionamento, inizio a parlare di questo problema con David. Avendo sotto mano un computer con windows 2003 invece, verifichiamo che questo problema avviene anche con l'IIS 6. Una delle prime stranezze è che Visual Studio 2005, per richiamare quella web application di configurazione, non usa IIS ma il web integrato &amp;quot;Cassini&amp;quot; o chi per lui.&lt;/p&gt;&lt;p&gt;Iniziamo altre ricerche e proviamo a modificare le impostazioni di IIS per farlo funzionare. Richiamiamo anche &lt;a title="Link esterno" href="http://www.dotnethell.it/articles/ASPNET20Configuration.aspx"&gt;Marco Caruso&lt;/a&gt; sapendo che aveva scritto un argomento un articolo. Alla fine troviamo dei documenti in internet che ci spiegano brevemente che è stato tolto dalla beta 2 di asp.net 2.0 la possibilità di richiamare quel pannello di controllo per questioni di sicurezza.&lt;/p&gt;&lt;p&gt;Ok, un'altra cosa tolta nell'asp.net 2.0 dopo i già numerosi tagli evvenuti finora.&lt;/p&gt;&lt;p&gt;Cercando ora su Internet ho trovato una soluzione &lt;a title="Link esterno" href="http://weblogs.asp.net/jeffwids/archive/2005/07/26/420572.aspx"&gt;alternativa&lt;/a&gt;. Il tutto si basa sulla creazione nell'iis di una directory virtuale che punti alla directory dov'è memorizzata l'applicazione per la configurazione web, per esempio:&lt;/p&gt;&lt;p&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50215\ASP.NETWebAdminFiles&lt;/p&gt;&lt;p&gt;Quindi richiamare dal web la pagina di configurazione in questo modo:&lt;/p&gt;&lt;p&gt;http://localhost/webadmin/default.aspx?applicationPhysicalPath=c:\wwwroot\timetracker\&amp;amp;applicationUrl=/Timetracker&lt;/p&gt;&lt;p&gt;Ma ora che utilità ha visto che in servizi di hosting sarà sempre bloccata? Anzi, a dire il vero, ha mai avuto utilità? :-D&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1255/Webadmin.axd-Beta-Asp.net-2.0.-Fine-Fatto.aspx"&gt;&lt;em&gt;webadmin.axd dalla beta 2 di asp.net 2.0... che fine ha fatto?&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1255/Webadmin.axd-Beta-Asp.net-2.0.-Fine-Fatto.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1255/Webadmin.axd-Beta-Asp.net-2.0.-Fine-Fatto.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1255.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1255</trackback:ping></item><item><title>Modifica web.config con il WebConfigurationManager</title><link>http://blogs.aspitalia.com/az/post1214/Modifica-Web.config-WebConfigurationManager.aspx</link><pubDate>Tue, 13 Sep 2005 18:22:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=1214" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Una &lt;a title="Forum aspitalia" href="http://forum.aspitalia.com/forum/topic.aspx?PostID=246048"&gt;domanda&lt;/a&gt; su un forum mi aveva fatto venire in mente un vecchio blog che avevo scritto all'uscita di una delle prime versione di Visual Studio 2005. L'ho &lt;a title="blog di AZ" href="http://blogs.aspitalia.com/az/post125/ModificheWebconfigAspnet20.aspx"&gt;ritrovato&lt;/a&gt;, era il lontanissimo 6 dicembre del 2003! Da allora sono cambiate un sacco di cose. Il tempo cambia il mondo, i popoli, le singole persone... e non poteva mancare da queste trasformazioni anche l'asp.net 2.0.&lt;/p&gt;&lt;p&gt;Le cose sono parecchio cambiate ad essere sincero. Ora c'è la classe WebConfigurationManager che ci permette di modificare il web.config, o la  machine.config della nostra web application.&lt;/p&gt;&lt;p&gt;Vediamo un esempio banale adatto alla risposta al quesito sul forum in cui veniva chiesto se era possibile modificare in modo globale il &lt;em&gt;theme&lt;/em&gt; di una web.application:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;%@ Import Namespace=&amp;quot;System.Configuration&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;%@ Import Namespace=&amp;quot;System.Web.Configuration&amp;quot; %&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&amp;lt;script runat=&amp;quot;server&amp;quot; language=&amp;quot;C#&amp;quot;&amp;gt;&lt;br /&gt;void Page_Load(object source, EventArgs e)&lt;br /&gt;{&lt;br /&gt;Configuration config;&lt;br /&gt;config = WebConfigurationManager.OpenWebConfiguration(&amp;quot;~&amp;quot;);&lt;br /&gt;PagesSection p;&lt;br /&gt;p = config.GetSection(&amp;quot;system.web/pages&amp;quot;) as PagesSection;&lt;br /&gt;if (p != null)&lt;br /&gt;{&lt;br /&gt;    Response.Write(&amp;quot;Trovato: &amp;quot; + p.Theme);&lt;br /&gt;    p.Theme = &amp;quot;Theme2&amp;quot;;&lt;br /&gt;    config.Save();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;    Response.Write(&amp;quot;Non trovato&amp;quot;);&lt;br /&gt;}&lt;/code&gt;&lt;/p&gt;&lt;p&gt;La funzione &lt;em&gt;OpenWebConfiguration&lt;/em&gt; carica il web.config attuale dalla root della webapplication attuale. Quindi la funzione &lt;em&gt;GetSection&lt;/em&gt; prende la sezione di nostro interesse.&lt;/p&gt;&lt;p&gt;Tutto le sezioni sono modificabili, come nell'esempio successivo per la &lt;em&gt;sessionState&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;void Page_Load(object source, EventArgs e)&lt;br /&gt;{&lt;br /&gt;Configuration config;&lt;br /&gt;config = WebConfigurationManager.OpenWebConfiguration(&amp;quot;~&amp;quot;);&lt;br /&gt;SessionStateSection s;&lt;br /&gt;s = config.GetSection(&amp;quot;system.web/sessionState&amp;quot;) as SessionStateSection;&lt;br /&gt;if (s != null)&lt;br /&gt;{&lt;br /&gt;    Response.Write(&amp;quot;Trovato: &amp;quot; + s.Cookieless.ToString());&lt;br /&gt;    s.Cookieless = HttpCookieMode.UseCookies;&lt;br /&gt;    config.Save();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;    Response.Write(&amp;quot;Non trovato&amp;quot;);&lt;/code&gt;&lt;p&gt;Anche la sezione della ConnectionStrings è modificabile:&lt;/p&gt;&lt;code&gt;Configuration config;&lt;br /&gt;config = WebConfigurationManager.OpenWebConfiguration(&amp;quot;~&amp;quot;);&lt;br /&gt;ConnectionStringsSection c;&lt;br /&gt;c = config.GetSection(&amp;quot;connectionStrings&amp;quot;) as ConnectionStringsSection;&lt;br /&gt;if (c != null)&lt;br /&gt;{&lt;br /&gt;    Response.Write(&amp;quot;Trovato: &amp;quot; + c.ConnectionStrings[0]);&lt;br /&gt;    c.ConnectionStrings[0].ConnectionString += &amp;quot;;&amp;quot;; // riga 1&lt;br /&gt;    c.ConnectionStrings.Add(new ConnectionStringSettings(&amp;quot;prova&amp;quot;,&amp;quot;...&amp;quot;)); /riga 2&lt;br /&gt;    config.Save();&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;    Response.Write(&amp;quot;Non trovato&amp;quot;);&lt;/code&gt;&lt;p&gt;In questo esempio, nella linea di codice contrassegnato con &amp;quot;&lt;em&gt;riga 1&lt;/em&gt;&amp;quot; modifichiamo la stringa di connessione presente aggiungendo un punto e virgola. In &amp;quot;&lt;em&gt;riga 2&lt;/em&gt;&amp;quot; aggiungiuamo una nuova stringa di connessione di nome &amp;quot;prova&amp;quot;.&lt;/p&gt;&lt;p&gt;Un'ultima avvertenza: l'utente aspnet (o quello del vostro server) che elabora le pagine aspnet deve avere i diritti in scrittura sulla directory dov'è presente il web.config, altrimenti l'exception è in agguato. In ultimo: una modifica del web.config fa ripartire l'applicazione con ovvio rallentamento. Usare con parsimonia.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/web.config/" rel="tag"&gt;web.config&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/az/post1214/Modifica-Web.config-WebConfigurationManager.aspx"&gt;&lt;em&gt;Modifica web.config con il WebConfigurationManager&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET2, ASP.NET, web.config</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post1214/Modifica-Web.config-WebConfigurationManager.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post1214/Modifica-Web.config-WebConfigurationManager.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS1214.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=1214</trackback:ping></item></channel></rss>
