<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Giuseppe Guerrasio : ASP.NET</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx</link><description>Tags: ASP.NET</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Yoox dal retail alla piattaforma multibrand per e-commerce</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/06/16/yoox-dal-retail-alla-piattaforma-multibrand-per-e-commerce.aspx</link><pubDate>Mon, 16 Jun 2008 10:30:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8592977</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8592977.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8592977</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 7px 0px 0px; border-left: 0px; border-bottom: 0px" height="216" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/image_thumb.png" width="260" align="left" border="0" /&gt;&lt;/a&gt; Una delle attivit&amp;#224; pi&amp;#249; interessanti che mi &amp;#232; capitato di seguire negli ultimi mesi &amp;#232; collegata alla revisione architetturale che Yoox Group ha avviato sui suoi servizi e siti Internet.&lt;/p&gt;  &lt;p&gt;YOOX Group &amp;#232; il partner globale di Internet retail per i principali brand di moda &amp;amp; design: l&amp;#8217;unica azienda di retail su Internet sia multimarca &amp;#8211; con la boutique virtuale &lt;a href="http://yoox.com/"&gt;YOOX.COM&lt;/a&gt;, sia monomarca &amp;#8211; con i flagship store online sviluppati da YOOX Services.&lt;/p&gt;  &lt;p&gt;Nato nel 2000 ha avviato un nuovo modello di business con la boutique virtuale N&amp;#176; 1 al mondo &lt;a href="http://yoox.com/"&gt;YOOX.COM&lt;/a&gt;, che ha contribuito pionieristicamente a creare lo shopping di moda online nel nostro Paese. &lt;/p&gt;  &lt;p&gt;L&amp;#8217;infrastruttura globale sincronizzata su tre continenti, insieme all&amp;#8217;esperienza accumulata in questi anni, hanno portato all&amp;#8217;apertura nel 2006 di YOOX Services, societ&amp;#224; di YOOX Group che progetta e gestisce gli online store per conto dei principali brand di moda &amp;amp; design. YOOX Services realizza i flagship store dei principali brand della moda &amp;amp; design che intendono offrire online la stessa collezione disponibile attualmente nei negozi. &lt;/p&gt;  &lt;p&gt;Attualmente i flagship store online monomarca &amp;#8220;powered by YOOX&amp;#8221; sono: &lt;a href="http://www.marni.com"&gt;www.marni.com&lt;/a&gt;, &lt;a href="http://www.emporioarmani.com/"&gt;www.emporioarmani.com&lt;/a&gt;, &lt;a href="http://www.diesel.com/"&gt;www.diesel.com&lt;/a&gt;, &lt;a href="http://www.cpcompany.com/"&gt;www.cpcompany.com&lt;/a&gt;, &lt;a href="http://www.stoneisland.com/"&gt;www.stoneisland.com&lt;/a&gt; e presto saranno annunciati molti altri virtual store dei principali brand del lusso. &lt;/p&gt;  &lt;p&gt;A questi si &amp;#232; aggiunto il nuovissimo &lt;a href="http://thecorner.com/"&gt;THECORNER.COM&lt;/a&gt; &amp;#8220;powered by YOOX&amp;#8221;, un department store online completamente dedicato alle nuove collezioni di designer internazionali &amp;#8221;cutting edge&amp;#8221; e a brand italiani di ricerca ognuno con un &amp;#8220;corner&amp;#8221; dedicato.&lt;/p&gt;  &lt;p&gt;Una case history di successo se guardiamo i numeri di YOOX.COM: un sito localizzato in 7 lingue con pi&amp;#249; di quattro milioni di visitatori al mese e pi&amp;#249; di un milione di capi consegnati in tutto il mondo nel 2007 in 53 paesi. &lt;/p&gt;  &lt;p&gt;Dal punto di vista tecnico la necessit&amp;#224; di dover passare da un singolo Internet retailer ad una nuova serie di siti monobrand ha comportato la necessit&amp;#224; di una profonda revisione dell&amp;#8217;architettura su cui yoox services implementa le soluzioni Internet. I piani di Yoox Group, infatti, prevedono lo sviluppo di un numero significativo di siti monbrand o specialistici e pertanto la nuova piattaforma tecnologica per Yoox Service dovr&amp;#224; prevedere la possibilit&amp;#224; di implementare e gestire con sempre maggiore velocit&amp;#224; nuove tipologie di siti. &lt;/p&gt;  &lt;p&gt;Dal punto di vista architetturale Yoox Services si &amp;#232; trovata di fronte all&amp;#8217;esigenza di muovere la propria soluzione per yoox.com da un sito di e-commerce ad una vera e propria piattaforma che possa permettere la costruzione e la gestione di &amp;#8220;n&amp;#8221; siti, mettendo a fattor comune un insieme di servizi di base con lo scopo di semplificare lo sviluppo , manutenzione e sfruttamento dell&amp;#8217;hardware, ma permettendo al tempo stesso il necessario isolamento tra i siti, la flessibilit&amp;#224; per gli elementi di interfaccia utente e la costruzione dei contenuti di ciascuno store virtuale, garantendo allo stesso tempo la necessaria scalabilit&amp;#224; rispetto al volume di richieste gi&amp;#224; oggi elevato sul solo Yoox.com.&lt;/p&gt;  &lt;p&gt;Per rispondere a queste esigenze Yoox Group ha quindi avviato uno studio per l&amp;#8217;implementazione di una nuova piattaforma che viene da identificata con il termine OSS (ONLINE STORE SERVICES) per rispondere alle nuove esigenze del gruppo e garantire gli stessi livelli di qualit&amp;#224; , scalabilit&amp;#224; e costi offerti dalla soluzione che ha contribuito in modo determinate al successo di Yoox.com.&lt;/p&gt;  &lt;p&gt;La nuova architettura &amp;#232; divisa in due componenti fondamentali: una componenti di front-end che si preoccupa di gestire acquisizione di ordini e gestione del sito (catalogo, profili, carrello, pagamenti, etc) ed una componente di back-end che riceve gli ordini attraverso un un meccanismo di code asincrone dove attraverso Microsoft BizTalk e Microsoft Navision vengono gestite le interazioni con i partner , le operazioni logistiche di spedizione e la fatturazione. &lt;/p&gt;  &lt;p&gt;La componente di front-end prevede una parte di user interface (UI) , una serie di Web Service per erogazione di servizi a siti terzi (ad esempio il catalogo) ed alle componenti lato client della UI (JS AJAX, FLASH, SILVERLIGHT, WPF\.NET) , una parte di servizi con la logica delle operazioni del sito e uno storage per i dati.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image004_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="268" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image004_thumb.jpg" width="357" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I principi architetturali che guidano il rifacimento della componente di front-end che si &amp;#232; deciso di seguire per l&amp;#8217;evoluzione dal mono sito a multi sito possono essere rappresentati come indicato nella seguente figura:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image006_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="367" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image006_thumb.jpg" width="386" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;L&amp;#8217;idea guida di base &amp;#232; quella di passare da un&amp;#8217;architettura single-tenant dove ciascuna istanza dei siti &amp;#232; implementata con una singola soluzione adhoc\custom ,ad una piattaforma che ricalchi la struttura di base dei servizi offerti attualmente in yoox.com, fornendoli con una architettura multi-tenant scalabile e configurabile. I principi architetturali impostati partono dalle idee impostate per le architetture SaaS e quindi gran parte delle impostazioni sulle architetture multi-tenant indicate ottimo &lt;a href="http://msdn.microsoft.com/en-us/architecture/aa479069.aspx"&gt;documento di Carraro e Chong&lt;/a&gt; sull&amp;#8217;argomento, ma vengono riadattati alle forti esigenze di flessibilit&amp;#224; sugli aspetti di personalizzazione del front-end ed di gestione dei contenuti dello stesso necessari ad una applicazione di questo tipo.&lt;/p&gt;  &lt;p&gt;Dal punto di vista tecnologico nell&amp;#8217;implementazione della nuova architettura in corso di sviluppo Yoox ha scelto di utilizzare nelle componenti fondamentali la piattaforma Microsoft: Windows Server 2008 con IIS7 come piattaforma Web Server, SQL Server 2008 come storage e .NET 3.5 come framework di sviluppo con Visual Studio Team System e Team Foundation Server per l&amp;#8217;implementazione della software factory, Navision e Microsoft BizTalk Server nelle componenti di back-end.&lt;/p&gt;  &lt;p&gt;Ulteriore vincolo per la nuova architettura consiste nella necessit&amp;#224; di migrare per step successivi anche il sito principale yoox.com e di garantire,quindi, una completa continuit&amp;#224; di funzionamento. Proprio per questo motivo la migrazione dalla precedente architettura single-tenant basata su ASP/COM sta procedendo per step che prevedono come prima parte la costruzione dei nuovi servizi e l&amp;#8217;aggancio di questi alla attuale interfaccia. Terminata la costruzione dei nuovi servizi, verr&amp;#224; anche migrata la tecnologia utilizzata per la parte di interfaccia utente.&lt;/p&gt;  &lt;p&gt;Data la particolarit&amp;#224; della natura dei siti, infatti , la profonda necessit&amp;#224; di personalizzazione delle componenti di UI &amp;#232; una delle caratteristiche che a spinto Yoox alla decisione di mantenere quest&amp;#8217;ultimo aspetto sviluppato ad hoc per ogni tenant. In particolare , oltre alla classica interfaccia HTML sono previste anche interfacce di tipo differente tra cui piccoli smart client residenti sul desktop che offriranno agli utenti la possibilit&amp;#224; di un interazione pi&amp;#249; semplice con il catalogo del sito. Anche le componenti di UI di gestione del sito sono costruite con interfacce smart client.&lt;/p&gt;  &lt;p&gt;L&amp;#8217;architettura principale del nuovo front-end multi sito di YOOX pu&amp;#242; quindi essere rappresentata come di seguito:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image008_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="306" alt="clip_image008" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image008_thumb.jpg" width="376" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Le interfacce utente di ciascun tenant\sito accedono ai sevizi forniti dal OSS fornendo sempre un parametro che identifica il tenant stesso e ottenendo in questo modo l&amp;#8217;accesso alla logica ed ai dati necessari al funzionamento della specifica istanza. Con questo tipo di approccio, ciascun elemento applicativo pu&amp;#242; scalare con un approccio orizzontale che comporta la semplice aggiunta di macchine fisiche o virtuali all&amp;#8217;architettura su tutti gli strati applicativi , compresa la parte di dati. Anche a questo livello, infatti, viene utilizzato un partizionamento dei dati rispetto alle istanze che identificano i tenant . Questo approccio consente di suddividere i dati in differenti database che possono anche essere ospitati su macchine fisiche o virtuali diverse in funzione delle esigenze di scalabilita. Lo strato di accesso ai dati dei servizi conterr&amp;#224; la logica necessaria ad individuare la partizione corretta in base all&amp;#8217;identificativo del tenant\ sito fornito dal chiamante :&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image010_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="384" alt="clip_image010" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image010_thumb.jpg" width="518" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per un chiarimento sul tema del partizionamento dei dati vi rimando ai post fatti in passato sull argomento la scalabilit&amp;#224; ed il partizionamento in entit&amp;#224; parte 1 e parte 2 . Il disaccoppiamento tra front-end e back-end attraverso l&amp;#8217;utilizzo di una coda fa si che il carico prodotto nell&amp;#8217;inserimento di ordini o dalla navigazione degli utenti, non si rifletta direttamente sulle componenti che gestiscono le fasi di fatturazione e gestione logistica e di spedizione.&lt;/p&gt;  &lt;p&gt;I servizi sono sviluppati con tre differenti interfacce per permettere sia l&amp;#8217;interazione con le pagine ASP (COM), sia l&amp;#8217;interazione con componenti .NET in process , sia una interfaccia REST con XML o JSON . In questo modo ciascun servizio pu&amp;#242; o essere direttamente posizionato sulle macchine di front-end per essere consumato da UI HTML o per poter essere eventualmente esposto verso altre applicazioni ad estensione delle potenzialit&amp;#224; della piattaforma stessa. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image012_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="351" alt="clip_image012" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image012_thumb.jpg" width="450" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La maggior parte dei servizi utilizza WCF (Windows Communication Foundation) per esporre una parte delle interfacce di accesso e nello strato di accesso ai dati sfruttano le nuove funzionalit&amp;#224; offerte da LINQ.&lt;/p&gt;  &lt;p&gt;La struttura complessiva del sito pu&amp;#242; essere quindi rappresentata come di seguito:&lt;/p&gt;  &lt;p align="center"&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image014_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="344" alt="clip_image014" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image014_thumb.jpg" width="462" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8592977" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Software+Factories/default.aspx">Software Factories</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/SOA/default.aspx">SOA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ORM/default.aspx">ORM</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/BPM/default.aspx">BPM</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Smart+Client/default.aspx">Smart Client</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/IIS7/default.aspx">IIS7</category></item><item><title>Sessioni del lancio online</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/04/03/sessioni-del-lancio-online.aspx</link><pubDate>Thu, 03 Apr 2008 17:21:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8353927</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8353927.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8353927</wfw:commentRss><description>&lt;p&gt;Disponibili &lt;a href="http://www.microsoft.com/italy/beit/sezioni.aspx" target="_blank"&gt;online le sessioni del lancio&lt;/a&gt;. In particolare disponibile anche video e slide della sessione che ho preparato con Mario Fontana e Mauro Minella sul tema&amp;#160; Visual Tools For Office da titolo &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/italy/beit/sezione_video.aspx?vid=14" target="_blank"&gt;&amp;quot;Sviluppo di applicazioni per Microsoft Office System&amp;quot;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.microsoft.com/italy/beit/sezioni.aspx"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="320" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/Sessionidellancioonline_E5E1/image_3.png" width="758" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8353927" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ORM/default.aspx">ORM</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Office/default.aspx">Office</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/OBA/default.aspx">OBA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTO/default.aspx">VSTO</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>ADO.NET Data Service</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/04/ado-net-data-service.aspx</link><pubDate>Tue, 04 Mar 2008 12:00:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8021678</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8021678.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8021678</wfw:commentRss><description>&lt;p&gt;Un'altra interessante componente disponibile con la &lt;a href="http://asp.net/downloads/3.5-extensions/" target="_blank"&gt;CTP delle ASP.NET 3.5 Extension&lt;/a&gt; è la nuova infrastruttura per lo sviluppo di Web Data Service ADO.NET Data Service. Si tratta dell'evoluzione in prodotto della &lt;a href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/05/14/accesso-al-database-attraverso-un-url-code-name-astoria.aspx" target="_blank"&gt;tecnologia incubazione denominata "Astoria" mostrata a MIX 07&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Il nuovo framework ha lo scopo di semplificare l'erogazione di sorgenti dati sul Web venendo incontro alla trasformazione che i siti internet stanno avendo nell'utilizzo di queste funzionalità. &lt;/p&gt; &lt;p&gt;I siti Web da semplici erogatori di interfacce HTML si stanno trasformando in erogatori di dati.&amp;nbsp; Con lo sviluppo di AJAX e delle applicazioni RIA si sta&amp;nbsp; passando da un approccio in cui dall'esecuzione del codice lato server si accedeva alle sorgenti dati utilizzate nei siti&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="222" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb.png" width="488" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;ad un approccio in cui dal codice client che si esegue nel browser, si accede direttamente alle sorgenti dati via HTTP, genericamente attraverso un approccio REST&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="197" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_1.png" width="498" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Il framework ADO.NET Data Service è uno strato costruito sopra l'Entity Framework che permette di rendere accessibile attraverso un URL con uno stile REST il modello E/R implementato (per approfondimenti sull'entity framework vi consiglio : &lt;a title="http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx" href="http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx&lt;/a&gt;&amp;nbsp; e &lt;a title="http://msdn2.microsoft.com/en-us/library/cc161164(printer).aspx" href="http://msdn2.microsoft.com/en-us/library/cc161164(printer).aspx"&gt;http://msdn2.microsoft.com/en-us/library/cc161164(printer).aspx&lt;/a&gt;&amp;nbsp; ). In realtà non permette esclusivamente di esporre modelli dell'Entity framework ma di qualunque entità che implementi l'interfaccia IQueryable &amp;lt;T&amp;gt; .&lt;/p&gt; &lt;p&gt;Oltre a fornire le componenti server per esporre via Http con stile REST il modello di entità, il framework offre due nuove API client per semplificare l'accesso ai dati esposti in questa modalità:&lt;/p&gt; &lt;p&gt;- Un libreria JavaScript che estende i namespace della Microsoft Ajax Library (namespace Sys.Data ed in particolare Sys.Data.DataService nella Script Library&amp;nbsp; MicrosoftAjaxDataService.js)&lt;/p&gt; &lt;p&gt;- una libreria .NET pensata per client sia silverlight che .NET Framework per desktop ( namespace Microsoft.Data.WebClient contenuto nelle Extension con particolare riferimento alle classi WebDataContext e WebDataQuery ).&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Per poter analizzare più nel dettaglio il funzionamento del framework partiamo con l'implementare un semplice esempio basandoci sull'Entity Framework. In particolare partiremo con il creare un entity data model sul classico database Northwind per poi esporre con un servizio ADO.NET DataService le entità via http e poi accederci utilizzandole due librerie client citate.&lt;/p&gt; &lt;p&gt;I passi da implementare sono essenzilmente i seguenti:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;- Creare il Progetto&lt;/p&gt; &lt;p&gt;- Creare l'Entity Model&lt;/p&gt; &lt;p&gt;- Creare il Data Service e Autorizzare gli accessi&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Procediamo con la creazione di un nuovo Web Site. Dopo aver avviato il progetto, includiamo un elemento di tipo ADO.NET Entity Data Model lo connettiamo al classico database Nortwind , ottenendo un nuovo modello che utilizzeremo come base per l'esposizione del servizio di accesso ai dati.&lt;/p&gt; &lt;p align="center"&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="391" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_2.png" width="574" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align="center"&gt;&amp;nbsp; &lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="387" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_3.png" width="567" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_10.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="392" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_4.png" width="566" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Aggiungiamo ora un elemento di tipo ASP.NET Data Service e lo colleghiamo al modello EDM appena creato&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_12.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="397" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_5.png" width="576" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;ottenendo un servizio come quello che vediamo di seguito:&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_14.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="342" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_6.png" width="575" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Si tratta di un servizio che utilizza WCF ed il nuovo supporto REST offerto da .NET 3.5 e attraverso una infrastruttura costruita sopra queste funzionalità basata sulla classe WebDataService, espone il nostro EDM che in questo caso è basata data context NorthwindEntities che abbiamo appena costruito con il tool dell'entity framework e che stiamo indicando con lo specifico generics previsto dalla classe:&lt;/p&gt; &lt;p&gt;.........&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;public class Northwind: WebDtataService &amp;lt;NorthwindModel.NorthwindEntities&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;........&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In realtà la classe WebDataService come abbiamo già detto è in grado di gestire qualunque modello che implementi l'interfaccia IQueryable &amp;lt;T&amp;gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Per autorizzare l'accesso alle informazioni esposte dal servizio utiliziamo la classe di autorizzazione appositamente inserita nel servizio , aggiungendo al configurazione sul costruttore del servizio per ottenere l'accesso ai dati di tutti i clienti contenuti nel database nortwind su cui abbiamo costruito il nostro EDM.&lt;/p&gt; &lt;p&gt;Nel nostro piccolo esempio impostiamo l'accesso completo a tutte le risorse presenti nel modello esposto attraverso il servizio:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;namespace SimpleDataService { &lt;/p&gt; &lt;p&gt;&amp;nbsp; public class Northwind : WebDataService&amp;lt;NorthwindEntities&amp;gt; { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void InitializeService(IWebDataServiceConfiguration config) { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; config.SetResourceContainerAccessRule("*", ResourceContainerRights.All); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Per poter effettuare un test sul funzionamento del servizio è possibile inviare direttamente con un browser una richiesta GET del tipo seguente:&lt;/p&gt; &lt;p&gt; http://localhost:2759/WebSite1/Northwind.svc/Customers&lt;/p&gt; &lt;p&gt; con la quale otteniamo accesso ai dati di tutti i clienti. Oppure la seguente con cui otteniamo l'accesso ad uno specifico customer:&lt;/p&gt; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/Customers('alfki')&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_16.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="400" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_7.png" width="554" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;o ad esempio ai suoi ordini:&lt;/p&gt; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/Customers('alfki')/Orders&lt;/p&gt; &lt;p&gt;Per un introduzione sulla sintassi per ADO.NET DataService potete far riferimento a &lt;a title="http://quickstarts.asp.net/3-5-extensions/adonetdataservice/SimpleAddressingSchemeForDataWithUniformURLs.aspx" href="http://quickstarts.asp.net/3-5-extensions/adonetdataservice/SimpleAddressingSchemeForDataWithUniformURLs.aspx" target="_blank"&gt;http://quickstarts.asp.net/3-5-extensions/adonetdataservice/SimpleAddressingSchemeForDataWithUniformURLs.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Utilizzando la specifica sintassi prevista dal servizio si possono effettuare query e modifiche ai dati. In funzione del tipo di content type inviato nell'header http è possibile ottenere risposte con serializzazione XML o JSON.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; E' possibile anche implementare dei Query Interceptors o Change Interceptor sul WebService per agganciare del nostro codice e gestire specifiche richieste di Query o modifiche. Ad esempio per intercettare e gestire le richieste di Query sui Customers del nostro esempio si dovrà aggiungere il seguente metodo:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;[QueryInterceptor("Customers")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IQueryable&amp;lt;Customers&amp;gt; OnQueryOrders(IQueryable&amp;lt;Customers&amp;gt; customerQuery)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return from o in customerQuery&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where o.ContactName ==HttpContext.Current.User.Identity.Name&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select o;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;che fornirà esclusivamente accesso a quei customer dove il contactname corrisponde al nome dell'utente che sta accedendo al servizio. Per il Change Interceptor si utilizzerà l'attributo [ChangeInterceptor("......")] sul metodo Interceptor.&lt;/p&gt; &lt;p&gt;Oltre agli Interceptor è possibile estendere il servizio con dei nostri metodi custom attraverso quello che viene definito un Service Operation. Per aggiungere una Service Operation basta implementare uno specifico metodo come di seguito:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;[WebGet]&lt;br&gt;public IQueryable&amp;lt;Model.Customers&amp;gt; CustomersInCity(string cityName)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return from c in this.CurrentDataSource.Customers&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where c.City == cityName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c;&lt;br&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Renderlo accessibile con la configurazione delle autorizzazioni:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;public static void InitializeService(IWebDataServiceConfiguration config)&lt;br&gt;{&lt;br&gt; ...&lt;br&gt; config.SetServiceOperationAccessRule("CustomersInCity", ServiceOperationRights.All);&lt;br&gt;} &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;e potrà essere acceduto attraverso il seguente URL:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/CustomersInCity?cityName='Rome'&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Non soltando è possibile esporre dati ma utilizzando delle Service Operetions è possibile anche sfruttare gli attributi [SingleResult] e [MimeType] per realizzare interessanti combinazioni come ad esempio l'esposizione di template HTML collegati ai dati contenuti nel modello:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;[MimeType("text/html")]&lt;br&gt;[SingleResult]&lt;br&gt;[WebGet]&lt;br&gt;public IQueryable&amp;lt;string&amp;gt; WelcomePage()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new string[]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;" +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Welcome!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Currently we have " +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.CurrentDataSource.Customers.Count().ToString() + &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " customers.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }.AsQueryable();&lt;br&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Accessibili poi con URL di questo tipo: &lt;p&gt;&amp;nbsp; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/WelcomePage/$value &lt;p&gt;Ad esempio è possibile anche creare dei Tempale XAML per Silverlight che possono essere direttamente valorizati con dei dati come nell'esempio precedente e poi caricati dinamicamente nell'applicazione RIA client chiamante utilizzando ad esempio una chiamata XmlHttpRequest con la funzione &lt;a href="http://msdn2.microsoft.com/en-us/library/bb980072.aspx" target="_blank"&gt;createfromxaml&lt;/a&gt; del plugin. &lt;p&gt;Abbiamo parlato prima delle due librerie client disponibili per l'accesso via JavaScript e via .NET. Per l'utilizzo AJAX sfruttiamo la libreria JS MicrosoftAjaxDataService.js che ci mette a dsiposizione la classe Sys.Data.DataService . Referenziando la libreria : &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;lt;asp:ScriptManager ID="ScriptManager1" runat="server"&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp; &amp;lt;Scripts&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:ScriptReference Name="MicrosoftAjaxDataService.js" /&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Scripts&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;lt;/asp:ScriptManager&amp;gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;è possibile utilizzare la libreria per effettuare un query sui dati come di seguito:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;var northwindService = new Sys.Data.DataService("/Northwind.svc"); &lt;/p&gt; &lt;p&gt;northwindService.query("/Customers", onSuccess, onFailure);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Dove onSuccess e onFailure sono rispettivamente i metodi invocati all'arrivo della risposta o in caso di errore :&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;function onFailure(error, context, operation) {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $get("spanResults").innerHTML = "Error occurred in operation " + operation + "."; &lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;function onSuccess(result, context, operation) {&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp; // Get Customers list and put into a table.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp; var sb = new Sys.StringBuilder(); &lt;/p&gt; &lt;p&gt;&amp;nbsp; sb.append("&amp;lt;table&amp;gt;"); &lt;/p&gt; &lt;p&gt;var firstRowOutput = false; &lt;/p&gt; &lt;p&gt;for (idx in result) {&lt;/p&gt; &lt;p&gt;&amp;nbsp; var customer = result[idx]; &lt;/p&gt; &lt;p&gt;&amp;nbsp; if (!firstRowOutput) { // Display the header row. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;tr&amp;gt;"); for (key in customer) { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (key != "__metadata") { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;th&amp;gt;"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append(key); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;/th&amp;gt;"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;/tr&amp;gt;"); &lt;/p&gt; &lt;p&gt;firstRowOutput = true;&lt;/p&gt; &lt;p&gt;} // Display the data. &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;tr&amp;gt;"); &lt;/p&gt; &lt;p&gt;for (key in customer) {&lt;/p&gt; &lt;p&gt;&amp;nbsp; if (key != "__metadata") { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;td&amp;gt;"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append(customer[key]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;/td&amp;gt;"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;} &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;/tr&amp;gt;");&lt;/p&gt; &lt;p&gt;} &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;/table&amp;gt;");&lt;/p&gt; &lt;p&gt;$get("spanResults").innerHTML = sb.toString();&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La classe mette poi a disposizione le funzionalità per effettuare update ed insert.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Come già in precedenza segnalato è disponibile anche un namespace client .NET (Microsoft.Data.WebClient) per poter accedere con maggiore semplicità da client managed ai dati esposti da un servizio ASP.NET Data Service . &lt;/p&gt; &lt;p&gt;Attraverso la classe WebDataContext si gestisce il contesto verso uno specifico servizio e con la classe WebDataQuery si rappresentano e si eseguono le query verso la sorgente dati rappresentata da un WebDataContext:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;WebDataContext ctx = new WebDataContext(&lt;a href="http://localhost:51905/nw.svc"&gt;http://localhost:51905/nw.svc&lt;/a&gt;); &lt;/p&gt; &lt;p&gt;WebDataQuery&amp;lt;Customer&amp;gt; customers = ctx.CreateQuery&amp;lt;Customer&amp;gt;("/Customer"); &lt;/p&gt; &lt;p&gt;foreach (Customer r in customers) { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(c.CompanyName ); &lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La CTP mette a disposizione anche un generatore di codice (WebDataGen.exe) che, partendo dai metadatid el servizio, ci genera un modello ad oggetti che ci permette di utilizzare LINQ per accedere al servizio:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;\Program Files\Microsoft ASP.NET 3.5 Extensions\WebDataGen.exe" /mode:ClientClassGeneration /outobjectlayer:northwind.cs /uri:http://localhost:8090/Northwind.svc&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Generato il modello con il tool è possibile utilizzare per accedere ai dati del servizio codice come il seguente:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;using System;&lt;/p&gt; &lt;p&gt;using Microsoft.Data.WebClient; &lt;/p&gt; &lt;p&gt;using System.Linq; &lt;/p&gt; &lt;p&gt;using NorthwindModel;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;namespace TestApplication { &lt;/p&gt; &lt;p&gt;class Program { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; static void Main(string[] args) {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NorthwindEntities ctx = new NorthwindEntities(&lt;a href="http://localhost:8090/Northwind.svc"&gt;http://localhost:8090/Northwind.svc&lt;/a&gt;); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.MergeOption = MergeOption.AppendOnly; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var q = from c in ctx.Customers where c.City == "London" orderby c.CompanyName select c; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var cust in q) {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(cust.CompanyName); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;La classe NorthwindEntities deriva da WebDataContext e permette di gestire con LINQ un approccio tipizzato.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Sono possibili anche operazioni di update,delete e insert.&amp;nbsp; L'autenticazione sul servizio avviene passando le credenziali con la classica interfaccia ICredentials.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Conclusioni&lt;/p&gt; &lt;p&gt;ADO.NET Data Service fornisce un nuova nuova sofisticata modalità per esporre , consumare sorgenti dati attraverso un approccio REST che consente di costruire con rapidità servizi in grado di supportare con efficacia le esigenze di accesso ai dati nei nuovi scenari Internet con particolare riferimento alle applicazioni RIA. &lt;/p&gt; &lt;p&gt;Per una introduzione alle funzionalità del servizio vi suggerisco il &lt;a href="http://quickstarts.asp.net/3-5-extensions/adonetdataservice/ADONETDataServicesFramework.aspx" target="_blank"&gt;QuickStart online&lt;/a&gt; , il &lt;a href="http://blogs.msdn.com/astoriateam/default.aspx" target="_blank"&gt;blog del team&lt;/a&gt; dove troverete anche le novità in arrivo , e segnalo inoltre&amp;nbsp; alcuni video realizzati sull'argomento:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/305/ADONET-Data-Services-Surfacing-Data.aspx" target="_blank"&gt;ADO.NET Data Services - Surfacing Data&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/306/ADONET-Data-Services-Querying-with-URIs.aspx" target="_blank"&gt;ADO.NET Data Services - Querying with URI's&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/309/ADONET-Data-Services-A-Basic-NET-Client.aspx" target="_blank"&gt;ADO.NET Data Services - A Basic .NET Client&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/307/ADONET-Data-Services-A-Basic-AJAX-Client.aspx" target="_blank"&gt;ADO.NET Data Services - A Basic AJAX Client&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/308/ADONET-Data-Services-A-Basic-Silverlight-Client.aspx" target="_blank"&gt;ADO.NET Data Services - A Basic Silverlight Client&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/310/ADONET-Data-Services-Querying-with-LINQ.aspx" target="_blank"&gt;ADO.NET Data Services - Querying with LINQ&lt;/a&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/311/ADONET-Data-Services-Query-Interceptors.aspx" target="_blank"&gt;ADO.NET Data Services - Query Interceptors&lt;/a&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/312/ADONET-Data-Services-Service-Operations.aspx" target="_blank"&gt;ADO.NET Data Services - Service Operations&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8021678" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category></item><item><title>ASP.NET ed i Patterns: ASP.NET MVC (Model, View, Controller) Framework (Parte 2)</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/01/23/asp-net-ed-i-patterns-asp-net-mvc-model-view-controller-framework-parte-2.aspx</link><pubDate>Wed, 23 Jan 2008 12:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7152174</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/7152174.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=7152174</wfw:commentRss><description>&lt;P&gt;Nella &lt;A class="" href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/01/21/asp-net-ed-i-patterns-asp-net-mvc-model-view-controller-framework-parte-1.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/01/21/asp-net-ed-i-patterns-asp-net-mvc-model-view-controller-framework-parte-1.aspx"&gt;prima parte del post&lt;/A&gt; ho introdotto il nuovo ASP.NET MVC&amp;nbsp; Framework fino all'implementazione del Controller. Procediamo ora con l'approfondire alcuni elementi relativi all'interazione del Controller con la View che sono tra i principali valori dell'implementazione del MVC. 
&lt;P&gt;Nell'ASP.NET MVC Framework il Controller procede a determinare la view da implementare attraverso una Factory che implementa l'interfaccia IViewFactory così definita: 
&lt;P&gt;public interface IViewFactory&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IView CreateView(ControllerContext controllerContext, string viewName, string masterName, object viewData);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;Questa Factory consente al controller di determinare la view e di poter passare ad essa le informazioni di contesto della richiesta (ControllerContext)&amp;nbsp; e l'oggetto che rappresenta il Model (viewData) . 
&lt;P&gt;La View è costruita con una classe che implementa l'interfaccia IView che ha la seguente struttura: 
&lt;P&gt;public interface IView&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void RenderView(ViewContext viewContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;dove il viewContext è la seguente classe che deriva dal ControllerContext: 
&lt;P&gt;public class ViewContext : ControllerContext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ViewContext(ControllerContext controllerContext, object viewData, TempDataDictionary tempData);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ViewContext(RequestContext requestContext, IController controller, object viewData, TempDataDictionary tempData);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ViewContext(IHttpContext httpContext, RouteData routeData, IController controller, object viewData, TempDataDictionary tempData); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TempDataDictionary TempData { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public object ViewData { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;Avendo derivato il nostro controller dalla classe controller del framework MVC abbiamo a disposizione una serie di metodi e proprietà Helper per innescare la nostra View e fornirgli il Model che indicheremo come viewData come possiamo vedere guardando alla struttura della classe &lt;EM&gt;System.Web.MVC.Controller&lt;/EM&gt; : 
&lt;P&gt;public class Controller : IController&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Controller(); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ControllerContext ControllerContext { get; set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IHttpContext HttpContext { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IHttpRequest Request { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IHttpResponse Response { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RouteData RouteData { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IHttpServerUtility Server { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TempDataDictionary TempData { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IPrincipal User { get; }&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IDictionary&amp;lt;string, object&amp;gt; ViewData { get; }&lt;/STRONG&gt;&lt;B&gt;&lt;BR&gt;&lt;/B&gt;&lt;STRONG&gt;public IViewFactory ViewFactory { get; set; }&lt;/STRONG&gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual void Execute(ControllerContext controllerContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual void HandleUnknownAction(string actionName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual bool InvokeAction(string actionName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual void InvokeActionMethod(MethodInfo methodInfo);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual bool OnError(string actionName, MethodInfo methodInfo, Exception exception);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void OnPostAction(string actionName, MethodInfo methodInfo);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual bool OnPreAction(string actionName, MethodInfo methodInfo);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void RedirectToAction(object values);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void RedirectToAction(string actionName);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void RedirectToAction(string actionName, string controllerName);&lt;BR&gt;&lt;STRONG&gt;protected void RenderView(string viewName);&lt;/STRONG&gt;&lt;B&gt;&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void RenderView(string viewName, object viewData);&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void RenderView(string viewName, string masterName);&lt;/STRONG&gt;&lt;BR&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void RenderView(string viewName, string masterName, object viewData);&lt;/STRONG&gt;&lt;BR&gt;&lt;/B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;Ho evidenziato gli elementi della classe direttamente collegati alla gestione della view ed in particolare abbiamo: 
&lt;P&gt;- la proprietà ViewFactory sulla quale viene impostata la factory per la costruzione delle view ; 
&lt;P&gt;- i metodi Render che permettono di innescare la view fornendo come parametro sia i dati che le informazioni relative al nome della view; 
&lt;P&gt;- la proprietà ViewData che è un Dictionary utilizzato per fornire i dati che devono essere presentati al client dalla View. 
&lt;P&gt;Nell'implementazione di default del framework del nostro CustomerController, la proprietà ViewFactory viene impostata a runtime nel momento in cui viene assegnata una richiesta e creato il nostro controller e viene valorizzata con la ViewFactory di base del framework &lt;EM&gt;System.Web.Mvc.WebFormViewFactory&lt;/EM&gt; . Possiamo verificarlo mandando in debug la nostra applicazione e analizzando la proprieta sulla classe con il debbugger come di seguito: 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_2.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=302 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb.png" width=425 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb.png"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;Le View generate da questa factory sono essenzialmente della pagine che derivano dalla classe System.Web.Mvc.PageView&amp;nbsp; che come si vede dalla struttura della classe: &lt;/P&gt;
&lt;P&gt;public abstract class ViewPage : Page, IView, IViewDataContainer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected ViewPage(); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AjaxHelper Ajax { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public HtmlHelper Html { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string MasterLocation { get; set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public UrlHelper Url { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ViewContext ViewContext { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ViewData ViewData { get; } 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnPreInit(EventArgs e);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void RenderView(ViewContext viewContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual void SetViewData(object viewData);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;Questa non è altro che una particolare pagina aspx (deriva da System.Web.Page come tutte le pagine asp.net) che implementa l'interfaccia IView e l'interfaccia IViewDataContainer che permette la gestione dei dati del modello alla vista: 
&lt;P&gt;public interface IViewDataContainer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object ViewData { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;Esiste anche una implementazione della ViewPage che permette di passare alla view le informazioni relative ai dati del model in modo tipizzato: 
&lt;P&gt;public abstract class ViewPage&amp;lt;TViewData&amp;gt; : ViewPage&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected ViewPage(); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TViewData ViewData { get; } 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal override void SetViewData(object viewData);&lt;BR&gt;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;E' evidente che implementando le nostre View e fornendo al controller la nostra ViewFactory possiamo in qualunque momento decidere di implementare delle view alternative come ad esempio una XmlView&amp;nbsp; che fornisca una rappresentazione Xml dei dati nella risposta,oppure utilizzare delle view specifiche per eseguire gli unit test sul controller. 
&lt;P&gt;La WebViewFormViewFactory implementata di default sul controller dal framework, prevede che le viewpage siano inserite nella cartella view del sito, all'interno una sottocartella con il nome corrispondente al controller. Se nell'utilizzo del metodo RenderView non vogliamo indicare il nome della viewpage, possiamo anche chiamare la pagina .aspx con il nome della action che è il nome&amp;nbsp; di default che viene utilizzato, altrimenti indicheremo il nome che richiameremo utilizzando lo specifico parametro del metodo RenderView.&amp;nbsp; 
&lt;P&gt;Per poter chiudere il nostro piccolo esempio ed avere a disposizione nella view la lista dei customer,&amp;nbsp; procediamo con l'implementare una pagina esattamente come descritto utilizzando il template predefinito. La ViewPage può anche essere una content page e quindi avere a disposizione una page master attraverso le specifiche classi messe a disposizione dal framework. 
&lt;P&gt;Come primo test implementiamo una ViewPage tipizzata rispetto alla classe che rappresenta i dati del nostro model ed avremo una nuova pagina che potrà essere invocata attraverso il metodo helper RenderView e le informazione del model potranno essere inserite in nel Dictonary ViewData presente come proprietà nella nostra classe Controller ed utilizzato per passare i dati del model alla view. 
&lt;P&gt;Il codice del controller sarà il seguente: 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_4.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=208 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_1.png" width=648 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_1.png"&gt;&lt;/A&gt; 
&lt;P&gt;e la ViewPage sarà come di seguito: 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_6.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=288 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_2.png" width=508 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_2.png"&gt;&lt;/A&gt; 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_8.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=208 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_3.png" width=554 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;E' possibile anche usare un approccio non tipizzato rispetto alla classe che rappresenta i dati del nostro model, ed avremo una nuova pagina che potrà essere invocata attraverso il metodo helper RenderView e le informazione del model potranno essere inserite in nel Dictonary ViewData presente come proprietà nella nostra classe Controller ed utilizzato per passare i dati del model alla view. 
&lt;P&gt;Il codice del controller sarà: 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_10.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=219 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_4.png" width=596 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_4.png"&gt;&lt;/A&gt; 
&lt;P&gt;Nella ViewPage si potrà accedere alla lista dei customers riferendosi alla ViewData nel seguente modo: 
&lt;P&gt;ViewData["List"] as List&amp;lt;Customers&amp;gt; 
&lt;P&gt;Nella ViewPage per facilitare la costruzione dei link relativi ad una specifica action è a disposizione una classe di Helper HtmlHelper esposta già alla pagina con la proprietà Html. In particolare attraverso il metodo ActionLink è possibile costruire un link html alla action di uno specifico controller sfruttando la configurazione dell'URL routing. Ad esempio immaginiamo di avere una ulteriore action di nome ViewCustomer che permette di visualizzare i dati di un singolo customers e come parametro accetta un customerid, volendo aggiungere un link a questa action ad ogni elemento della lista della nostra pagina di esempio potremo scrivere : 
&lt;P&gt;Html.ActionLink(cn.CompanyName,"CustomerView","Customers") 
&lt;P&gt;ottenendo in risposta una stringa contenente il link URL costruito in base all'attuale configurazione del routing ovvero: 
&lt;P&gt;&lt;A href="http://localhost:64701/Customers/CustomerView" mce_href="http://localhost:64701/Customers/CustomerView"&gt;http://localhost:64701/Customers/CustomerView&lt;/A&gt; 
&lt;P&gt;Attraverso uno specifico overload del metodo è possibile passare uteriori parametri sfruttando gli &lt;A href="http://weblogs.asp.net/leftslipper/archive/2007/09/24/using-c-3-0-anonymous-types-as-dictionaries.aspx" mce_href="http://weblogs.asp.net/leftslipper/archive/2007/09/24/using-c-3-0-anonymous-types-as-dictionaries.aspx"&gt;"anonymus type" del linguaggio come dictionary&lt;/A&gt; ottenendo la possibilità di aggiungere anche il parametro per estrarre il customer: 
&lt;P&gt;&amp;lt;%= Html.ActionLink(cn.CompanyName, new {controller="Customers", action="CustomerView" , id=cn.CustomerID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; })%&amp;gt; 
&lt;P&gt;Ulteriore overload del metodo ci permette di lavorare in modo tipizzato rispetto all'oggetto controller: 
&lt;P&gt;&amp;lt;%= Html.ActionLink&amp;lt;MvcApplication1.Controllers.CustomersController&amp;gt;&amp;nbsp; (s=&amp;gt;s.CustomerView (cn.CustomerID ) ,cn.CompanyName)%&amp;gt; &amp;lt;/li&amp;gt; 
&lt;P&gt;In questo caso viene sfruttato l'expression tree delle lambda expression passate al metodo in modo tipizzato per poter calcolare l'url richiesto per lo specifico controller e la action con i rispettivi parametri&amp;nbsp; in base alla configurazione dell'infrastruttura di url routing. 
&lt;P&gt;Scaricando l'MVC Toolkit (download separato dalle ASP.NET extension 3.5)&amp;nbsp; e referenziandolo nel nostro progetto, si hanno a disposizione ulteriori estensioni alla classe HtmlHelper implementate come "Extension Method" . Ad esempio il metodo Select che consente di generare una select Html con il contenuto della sorgente allegata in databinding : 
&lt;P&gt;&amp;lt;%= Html.Select("test", ViewData,&amp;nbsp; "CompanyName", "CustomerId")&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %&amp;gt; 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image012_2.gif" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image012_2.gif"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=181 alt=clip_image012 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image012_thumb.gif" width=199 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image012_thumb.gif"&gt;&lt;/A&gt; 
&lt;P&gt;o il metodo ListBox con cui si ottiene una specifica listbox html : 
&lt;P&gt;&amp;lt;%= Html.ListBox ("test", ViewData,&amp;nbsp; "CompanyName", "CustomerId")&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %&amp;gt; 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image014_2.gif" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image014_2.gif"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=154 alt=clip_image014 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image014_thumb.gif" width=187 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/clip_image014_thumb.gif"&gt;&lt;/A&gt; 
&lt;P&gt;e così di seguito per gli altri metodi helper. 
&lt;P&gt;&lt;STRONG&gt;Effettuare uno Unit Test del nostro esempio&lt;/STRONG&gt; 
&lt;P&gt;Avendo a disposizione una infrastruttura che ci ha permesso di implementare in modo completamente separato il controller ed il model dalla view , è possibile implementare degli unit test sul controller senza coinvolgere direttamente tool per il test della UI. E' infatti possibile sviluppare degli unit test come il seguente: 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_12.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=249 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_5.png" width=689 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_5.png"&gt;&lt;/A&gt; 
&lt;P&gt;In questo caso con delle specifiche classi abbiamo sostituito il comportamento della classe controller e creato una view di test e possiamo in questo modo effettuare uno unit test del controller senza coinvolgere il resto dell'applicazione e dell'infrastruttura di ASP.NET.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Piccolo approfondimento url routing&lt;/STRONG&gt; 
&lt;P&gt;Abbiamo visto come nel MVC framework sia presente un'infrastruttura configurabile per il routing delle richieste che arrivano all'applicazione. Questa parte dell'framework è una implementazione del pattern "Front Controller" per determinare in modo configurabile la mappature URL -&amp;gt; Action\Controller. 
&lt;P&gt;Tutte le richieste in arrivo vengono agganciate da un HttpModule inserito nella pipeline del HttpRuntime di asp.net che si occupa di inviarle mapparle in base alla configurazione. 
&lt;P&gt;La configurazione di quelle che vengono definite le "Route" possibili per il calcolo del controller\action da applicare viene effettuata allo start della Web Application attraverso l'oggetto &lt;EM&gt;RouteTable.Routes&lt;/EM&gt;&amp;nbsp; che con il metoto Add permette di aggiungere ulteriori Route di configurazione. 
&lt;P&gt;Le Route rappresentano essenzialmente il mapping tra URL e Type del controller e action che devono essere eseguite per la specifica richiesta. 
&lt;P&gt;Aprendo il Global.asax del progetto troviamo le impostazioni di default del framework: 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_14.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=333 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_6.png" width=589 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_6.png"&gt;&lt;/A&gt; 
&lt;P align=center mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Per poter inserire delle nuove configurazioni occorre quindi costruire una nuova istanza della classe Route , fornirgli i parametri desiderati e appenderla alla collezione che contiene le configurazioni. 
&lt;P&gt;Ad esempio per ottenere un mapping di questo tipo: 
&lt;P&gt;Customers/ricercaclienti/[query]/[page] 
&lt;P&gt;per un controller CustomersController con la seguente action: 
&lt;P&gt;[ControllerAction] 
&lt;P&gt;public void RisultatiRicerca(string query,int page) 
&lt;P&gt;occorrerà aggiungere la seguente Route: 
&lt;P&gt;RouteTable.Routes.Add(new Route&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Url = "Customers/ricercaclienti/[query]/[page]",&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Defaults = new { controller = "Customers", action = "RisultatiRicerca", page = 0 },&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RouteHandler = typeof(MvcRouteHandler)&lt;BR&gt;}); 
&lt;P&gt;La classe Route permette anche di utilizzare le RegEx per validare il formato dei parametri utilizzati nella richiesta attraverso l'utilizzo della proprietà UrlRegEx . 
&lt;P&gt;L'HttpModule di routing inserito dall'MVC framework utilizza la tabella che contiene le Route per determinare&amp;nbsp; l'Handler a cui passare il compito di creare il controller e gestire il ciclo di vita della richiesta. 
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_16.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=352 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_7.png" width=363 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETMVCModelViewControllerFrameworkPa_1175B/image_thumb_7.png"&gt;&lt;/A&gt; 
&lt;P align=center mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;La classe impostata sulla proprietà RouteHandler dell'oggetto Route rappresenta un ulteriore punto di intercezione del framework. E' l'elemento che si occupa di fornire l'HttpHandler che utilizzerà la Factory di costruzione del Controller e ad impostare su questo gli oggetti di contesto gestendo il ciclo di vita della richiesta. La classe di default che viene utilizzata dal framewor per questa funzione è la System.Web.Mvc.MvcRouterHandler che&amp;nbsp; ha la seguente struttura: 
&lt;P&gt;public class MvcRouteHandler : IRouteHandler&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MvcRouteHandler(); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;L'interfaccia base che viene utilizzata per interagire con il RouteHandler è la seguente: 
&lt;P&gt;public interface IRouteHandler&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IHttpHandler GetHttpHandler(RequestContext requestContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;dove viene fornito il contesto della richiesta attraverso: 
&lt;P&gt;public class RequestContext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RequestContext(IHttpContext httpContext, RouteData routeData); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IHttpContext HttpContext { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RouteData RouteData { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;L'Handler che viene restituito di default dalL'MvcRouteHandler è implementato dalla classe: 
&lt;P&gt;public class MvcHandler : IHttpHandler, IRequiresSessionState&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public MvcHandler(); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual bool IsReusable { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RequestContext RequestContext { get; set; } 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual IController GetControllerInstance(Type controllerType);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual Type GetControllerType(string controller);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual void ProcessRequest(HttpContext httpContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected internal virtual void ProcessRequest(IHttpContext httpContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P&gt;Implementando una nostra classe di RouteHandler attraverso l'implementazione di IRouteHandler , possiamo inserirci all'interno del processo di caricamento dell'Handler che poi gestisce il ciclo di vita della richiesta controllandolo e cambiandone a piacimento il comportamento. 
&lt;P&gt;E' possibile anche sostituire la factory che viene utilizzata per la costruzione del Controller inserendo un ulteriore punto di intercezione. 
&lt;P&gt;La factory del controller implementa l'interfaccia &lt;EM&gt;System.Web.Mvc.IControllerFactory&lt;/EM&gt;&amp;nbsp; ed ha questo tipo di definizione: 
&lt;P&gt;public interface IControllerFactory 
&lt;P&gt;{ 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IController CreateController(IHttpContext context, RouteData routeData, Type controllerType); 
&lt;P&gt;} 
&lt;P&gt;per implementarne una nostra e sostituire la classe di default , occorre definire una classe che implementa l'interfaccia e registrarla con l'apposito metodo della classe &lt;EM&gt;System.Web.Mvc.ControllerBuilder&lt;/EM&gt;&amp;nbsp; all'application start nel global.asax: 
&lt;P&gt;ControllerBuilder.Current.SetDefaultControllerFactory(typeof(MyControllerFactory)); 
&lt;P&gt;&lt;STRONG&gt;Conclusioni&lt;/STRONG&gt; 
&lt;P&gt;Il nuovo MVC Framework offre una nuova infrastruttura basata sul pattern MVC per sviluppare soluzioni Web con ASP.NET completamente integrata con il resto delle funzionalità della piattaforma . Il nuovo framework verrà rilaciato nella ua versione definitiva con le ASP.NET 3.5 Extensions la cui data di rilascio è al momento prevista entro l'estate. 
&lt;P&gt;Per poterlo sperimentare un ottimo punto di partenza è rappresentato dal &lt;A href="http://quickstarts.asp.net/3-5-extensions/mvc/default.aspx" mce_href="http://quickstarts.asp.net/3-5-extensions/mvc/default.aspx"&gt;Quickstart on line&lt;/A&gt; delle ASP.NET Extension presente online. Interessanti anche &lt;A href="http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx" mce_href="http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx"&gt;i post di Scott sull'MVC Framework&lt;/A&gt; e ottimo il Post di &lt;A href="http://haacked.com/archive/2007/12/07/tdd-and-dependency-injection-with-asp.net-mvc.aspx" mce_href="http://haacked.com/archive/2007/12/07/tdd-and-dependency-injection-with-asp.net-mvc.aspx"&gt;Phil Haack post : TDD and Dependency Injection with ASP.NET MVC&lt;/A&gt; sull'utilizzo del pattern &lt;A href="http://www.martinfowler.com/articles/injection.html" mce_href="http://www.martinfowler.com/articles/injection.html"&gt;Dependency Injection&lt;/A&gt; e sull'approccio TDD (Test Driven Development) con l'MVC Toolkit . &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7152174" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>ASP.NET ed i Patterns: ASP.NET MVC (Model, View, Controller) Framework (Parte 1)</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/01/21/asp-net-ed-i-patterns-asp-net-mvc-model-view-controller-framework-parte-1.aspx</link><pubDate>Mon, 21 Jan 2008 13:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7152141</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/7152141.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=7152141</wfw:commentRss><description>&lt;P&gt;Con il rilascio in dicembre&amp;nbsp; della prima CTP (Customer Technology Preview) delle nuove&amp;nbsp; &lt;A title="ASP.NET 3.5 Extension" href="http://asp.net/downloads/3.5-extensions/" target=_blank mce_href="http://asp.net/downloads/3.5-extensions/"&gt;ASP.NET 3.5 Extension&lt;/A&gt; abbiamo a disposizione la prima versione pubblica del nuovo &lt;STRONG&gt;ASP.NET MVC Framework&lt;/STRONG&gt;. &lt;/P&gt;
&lt;P&gt;Il &lt;STRONG&gt;MVC (Model, View , Controller)&lt;/STRONG&gt; sui cui principi è basato il nuovo ASP.NET MVC Framework &lt;STRONG&gt;è un pattern&lt;/STRONG&gt; per sviluppare le componenti di presentation di un'applicazione che ha un ampio utilizzo nel mondo del Web, ne esistono moltissime implementazioni per differenti tecnologie e linguaggi. Il suo successo è essenzialmente dovuto alle caratteristiche implementative che consentono di separare nettamente la logica di controllo e la gestione dei dati del dominio applicativo,&amp;nbsp; dalla modalità con cui vengono presentate&amp;nbsp; le informazioni, rendendo più semplice manutenzione e test dell'applicazione.&lt;/P&gt;
&lt;P&gt;In&amp;nbsp; passato abbiamo visto nascere diversi tipi di framework più o meno validi per sviluppare applicazioni ASP.NET con il pattern MVC , la vera differenza del nuovo ASP.NET MVC Framework consiste in una vera e propria integrazione del modello nell'infrastruttura delle pagine dinamiche di .NET.&amp;nbsp; Il nuovo framework, infatti, trova spazio all'interno del namespace &lt;EM&gt;System.Web&lt;/EM&gt; con uno specifico namespace &lt;EM&gt;System.Web.Mvc&lt;/EM&gt; e si propone di diventare una vera e propria alternativa al classico modello di sviluppo delle pagine web con&amp;nbsp; .NET, per quei casi in cui la separazione della logica di controllo e degli oggetti del nostro dominio applicativo, dalla presentazione svolgono un ruolo determinate, o dove si vuole utilizza un approccio basato su un maggior livello di test del codice o addirittura uno sviluppo TDD (Test Driven Development).&amp;nbsp; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Overview dell'ASP.NET MVC Framework&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;L'infrastruttura classica per sviluppare pagine Web con ASP.NET è essenzialmente basata sul pattern "Page Controller" utilizzato come base concettuale di funzionamente dalle principali infrastrutture per lo sviluppo di pagine Web dinamiche. Le richieste&amp;nbsp; (URL) indirizzate ad ASP.NET vengono gestite dal runtime della piattaforma che assegna l'esecuzione della risorsa richiesta ad una pagina .aspx.&amp;nbsp; La pagina implementa il suo ciclo di vita gestito con una serie di eventi predefiniti che eseguono il "Page Controller" . In questo modo lo sviluppo dell'applicazione è rapido e semplice, ma si legano in modo determinante gli url richiesti alle pagine che implementano sia alla parte di logica che di presentazione vera e propria, rendendo di fatto più difficili tutte le attività di test, evoluzione e manutenzione dell'applicazione. &lt;/P&gt;
&lt;P&gt;In particolare le difficoltà collegate alla costruzione di unit test rappresentano uno dei più significativi limiti portati da questo tipo di pattern. Essendo, infatti, l'implementazione del controller, strettamente legata alla pagina e quindi all'ambiente in cui la pagina vive (HttpContext e tutti gli altri elementi di contesto e funzionamento della pagina e di ASP.NET) , diventa praticamente impossibile sia realizzare uno sviluppo TDD&amp;nbsp; che gestire dei semplici unit test sulla parte di logica del controller.&lt;/P&gt;
&lt;P&gt;Per approfondire l'implementazione del "Page Controller" in ASP.NET vi suggerisco di leggere&amp;nbsp; &lt;A href="http://msdn2.microsoft.com/en-us/library/ms998548.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/ms998548.aspx"&gt;Implementing Page Controller in ASP.NET&lt;/A&gt; .&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nell' ASP.NET MVC Framework vengono realizzati ed applicati i principi base del pattern&amp;nbsp; MVC ovvero la netta separazione tra i tre elementi fondamentali che concettualmente lo compongono:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;- &lt;STRONG&gt;Model&lt;/STRONG&gt;: Gestisce il modello di oggetti che rappresentano i dati nel nostro Dominio Applicativo e fornisce la logica per la gestione dei dati. Nelle applicazioni più semplici basate su ASP.NET può essere anche un normale Dataset. &lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;View&lt;/STRONG&gt;: Gestisce le modalità di presentazione dei dati attraverso il model che gli viene assegnato&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;Controller&lt;/STRONG&gt;: E' l'elemento principale&amp;nbsp; del pattern, si occupa di gestire&amp;nbsp; la richiesta e di coordinarne la logica di esecuzione utilizzando Model e selezionando la View da associare per la risposta&amp;nbsp; .&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Esistono diverse sfumature nell'MVC ma nelle implementazioni Web di questo pattern viene utilizzato principalmente&amp;nbsp; l'MVC con view passiva ed il flusso è genericamente quello rappresentato nel seguente disegno:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P align=center&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_12.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=351 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_5.png" width=472 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;La richiesta ad uno specifico URL viene assegnata ad un Controller che implementa la logica di esecuzione delle azioni necessarie a fornire la risposta al client. Il Controller utilizza il Model per rappresentare i dati necessari alla risposta, li associa ad una View con cui non è strettamente collegato ed a cui assegna il compito di presentarli al richiedente.&lt;/P&gt;
&lt;P&gt;In particolare nella definizione dell'architettura del nuovo framework MVC per ASP.NET&amp;nbsp; uno dei principali elementi di attenzione è stato posto nel principio di Estendibilità che è anche alla base dell'ottenimento di un'infrastruttura più semplicemente testabile. L'intera architettura, infatti,&amp;nbsp; fà un ampio uso di interfacce e factory per praticamente l'intera gamma di elementi che la compongono. La costruzione del controller e della view, avviene attraverso delle specifiche factory che, attraverso la sostituzione delle stesse e l'utilizzo di pattern come il Dependency Injection, permettono lo sviluppo di sofisticati ambienti di test per il codice ed una grande flessibilità nell'architettura.&lt;/P&gt;
&lt;P&gt;Ulteriore esempio di flessibilità inserito nel framework non propriamente collegato al pattern MVC&amp;nbsp; è rappresentato dall'engine di routing che consente la mappatura degli URL con la specifica classe Controller che ne deve gestire l'esecuzione e l'indirizzamento della View per produrre la risposta.&lt;/P&gt;
&lt;P&gt;Il seguente disegno rappresenta una semplificazione del ciclo di esecuzione di una richiesta all'interno dell'ASP.NET MVC Framework :&lt;/P&gt;
&lt;P align=center&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_6.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=385 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_2.png" width=634 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;La richiesta viene intercettata da un HttpModule specifico inserito dal framework MVC (UrlRoutingModule) e indirizzata alla componente che si occupa di&amp;nbsp; effettuare il routing che, in base all'URL ed alla sua configurazione, individua un oggetto Route che rappresenta il match tra richiesta e il&amp;nbsp; controller che deve gestirla. &lt;/P&gt;
&lt;P&gt;L'oggetto Route utilizza il RouteHandler ad esso associato, assegna l'esecuzione della richiesta ad un controller creandone un'istanza attraverso una specifica factory ed esegue il metodo sul controller associato all'&lt;EM&gt;azione&lt;/EM&gt; specifica che il controller deve eseguire. &lt;/P&gt;
&lt;P&gt;Il controller riceve il contesto della richiesta, esegue l'azione e utilizzando il model prepara i dati da passare alla view che viene innescata su richiesta attraverso una specifica factory.&lt;/P&gt;
&lt;P&gt;La View costruisce la risposta che viene inviata al browser.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Un esempio pratico per la gestione di una richiesta con l' ASP.NET MVC Framework&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Proseguiamo nell'illustrare le componenti del framework con un piccolo esempio con il quale vogliamo implementare una semplice applicazione Web per ricercare informazioni sui nostri clienti.&amp;nbsp; Per il momento trascuriamo il funzionamento dell'infrastruttura di routing su cui torneremo dopo e la utiliziamo con la sua configurazione di default. &lt;/P&gt;
&lt;P&gt;Per poter sviluppare con Visual Studio un'applicazione MVC occorre selezionare lo specifico template di progetto Web:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_2.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=342 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb.png" width=475 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;L'organizzazione e gli artifatti prodotti dal template di progetto si presentano come di seguito :&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_4.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=335 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_1.png" width=244 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Vengono create le seguenti cartelle:&lt;/P&gt;
&lt;P&gt;\Content&amp;nbsp;&amp;nbsp; per i contenuti grafici e di stile&lt;/P&gt;
&lt;P&gt;\Controllers&amp;nbsp;&amp;nbsp; per l'inserimento del codice delle classi Controller&lt;/P&gt;
&lt;P&gt;\Models per contenere le classi models del progetto&lt;/P&gt;
&lt;P&gt;\Views per le classi view , contiene una sotto cartella per ogni controller e una view per ogni action&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;La configurazione di default impostata per il routing associa l'url al controller attraverso la seguente modalità:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;/[Controller]/[Action]?paramname1=paramvalue1,.....&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dove [Controller] è il nome della classe che implementa il controller stesso per la specifica richiesta, [Action] rappresenta l'azione che deve essere eseguita sul controller ed i parametri vengono inseriti nel contesto della richiesta come valori che la action deve utilizzare o come&amp;nbsp; parametri di input per l'esecuzione. Vedremo successivamente che implementando opportunamente la action è anche possibile passare dei parametri con il formato:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;/[Controller]/[Action]/[id]&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ad esempio nel caso in cui abbiamo una richiesta&amp;nbsp; in cui l'url è&amp;nbsp; /Customers/....&amp;nbsp;&amp;nbsp; con la configurazione di default descritta&amp;nbsp; verrà ricercata una classe controller di nome CustomersController che sarà la classe che utilizzeremo per gestire le azioni collegate ai nostri clienti.&lt;/P&gt;
&lt;P&gt;Per poter implementare una classe come controller occorre implementare l'interfaccia &lt;EM&gt;System.Web.MVC.IController&lt;/EM&gt; che viene usata come contratto con il resto dell'infrastruttura del framework e per ricevere il contesto della richiesta&amp;nbsp;&amp;nbsp; che viene rappresentato con la classe &lt;EM&gt;System.Web.MVC.ControllerContext&lt;/EM&gt;. L'interfaccia IController ha la seguente struttura:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;public interface IController&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Execute(ControllerContext controllerContext);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;La classe ControllerContext è definita come di seguito :&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;public class ControllerContext : RequestContext&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ControllerContext(RequestContext requestContext, IController controller);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ControllerContext(IHttpContext httpContext, RouteData routeData, IController controller); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IController Controller { get; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;e contiene le informazioni necessarie al gestire il contesto dell'esecuzione , abbiamo il Controller assegnato e la classe &lt;EM&gt;System.Web.MVC.RequestContext&lt;/EM&gt;&amp;nbsp; definita come di seguito:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;public class RequestContext&lt;BR&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RequestContext(IHttpContext httpContext, RouteData routeData); 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IHttpContext HttpContext { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public RouteData RouteData { get; internal set; }&lt;BR&gt;&amp;nbsp;&amp;nbsp; } 
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Questa classe contiene in particolare:&amp;nbsp; &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;- i dati di routing determinati in base all'url &lt;/P&gt;
&lt;P&gt;- il contesto della richiesta ASP.NET gestita con la classica HttoContext &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In particolare l'HttpContext viene in questo caso agganciato partendo dall'interfaccia System.Web.IHttpContext per permetterne una sostituzione sia di questa che&amp;nbsp; delle interfacce IHttpRequest e IHttpResponse in fase di unit test senza dover derivare dalle classi base dell' infrastruttura di&amp;nbsp; ASP.NET.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Per semplificarne la costruzione di un Controller si può derivare dalla classe &lt;EM&gt;System.Web.MVC.Controller&lt;/EM&gt; che oltre al metodo Execute implementa una serie di funzionalità e di metodi helper che permettono di sviluppare concentrandoci sulla logica del controller riducendo al minimo il codice di infrastruttura necessario.&lt;/P&gt;
&lt;P&gt;Abbiamo già detto che ogni controller può implementare una o più Action che rappresentano le azioni che possono essere eseguite sul controller e che nella configurazione di default del routing vengono, come sopra descritto, rimappate sull'url richiesto. &lt;/P&gt;
&lt;P&gt;Ad esempio&amp;nbsp; l'url /Customers/List che useremo per avere una lista di tutti i nostri clienti, viene interpretato con esecuzione della action "List" sul Controller CustomersController . &lt;/P&gt;
&lt;P&gt;Le Action vengono associate ai metodi marcati con lo specifico attributo &lt;EM&gt;&lt;EM&gt;S&lt;/EM&gt;ystem.Web.MVC.Controller&lt;/EM&gt; . &lt;/P&gt;
&lt;P&gt;Nel nostro esempio, quindi, per poter implementare il controller Customers implementeremo la seguente classe:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_8.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=339 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_3.png" width=363 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ogni controller implementa anche una Action di base che viene nella configurazione di default associata alla action Index e che è quella che viene eseguita in assenza di informazioni di routing relative alla action nell'url come ad esempio nel caso di una URL : /Customers.&lt;/P&gt;
&lt;P&gt;Alla nostra action possono&amp;nbsp; essere passati anche dei parametri che possono essere estratti attraverso l'utilizzo dell'oggetto di contesto della richiesta. Infatti, come abbiamo già visto sopra, quest'ultimo implementa IHttpcontext di ASP.NET e quindi contiene l'oggetto che rappresenta la richiesta implementando IHttpRequest. &lt;/P&gt;
&lt;P&gt;Avendo derivato il nostro oggetto dalla classe Controller abbiamo già a disposizione la proprietà Request sulla nostra classe che ci permette di accedere direttamente all'oggetto Request del contesto della richiesta arrivata al controller.&lt;/P&gt;
&lt;P&gt;Ad esempio con una richiesta di url in cui vogliamo passare un parametro per paginare i dati estratti ed estrarre la pagina 1 della lista clienti: /Customers/List?page=1&amp;nbsp; possiamo dall'interno del nostro metodo di action estrarre il parametro nel seguente modo:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;this.Request["page"];&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;sapendo che lo utilizzeremo come un int :&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;int i = Convert.ToInt32(this.Request["page"]);&amp;nbsp; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;E' possibile anche utilizzare un formato per il metodo della action che preveda già direttamente i parametri come ad esempio:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_10.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=395 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_4.png" width=409 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In questo caso potrà essere usato il formato di URL seguente :&amp;nbsp; /Customers/List/1 ed il parametro successivo a list verrà direttamente associato al parametro del metodo perchè previsto dalla configurazione di default dell'url routing. &lt;/P&gt;
&lt;P&gt;Agendo sulla configurazione del routing, come vedremo, si possono cambiare questi comportamenti nella gestione dei paramentri, aggiungerne ed inserire anche dei validatori sull'url che vengono eseguiti prima di innescare&amp;nbsp; il controller.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Per costruire il Model del nostro esempio, utiliziamo LinqToSql e procediamo a mappare una classe Customers sulla tabella omonima del database Northwind. &lt;/P&gt;
&lt;P&gt;LinqToSql ci costruisce l'infrastruttura di classi necessaria derivandola dai metadati del database. Possiamo quindi procedere ad utilizzare le classi che sono state generate dai tool di visual studio ed implementare il segente metodo GetCustomers nel NorthwindDataContext che verrà usato dal controller per estrarre la lista dei clienti:&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_24.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_24.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=381 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_11.png" width=642 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETediPatternMVCModelViewControlTool_10742/image_thumb_11.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Terminata l'implementazione del Model e della logica della nostra Action , l'ultimo passo consiste nell'associare il model alla view che dovrà rappresentarlo. &lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://blogs.wankuma.com/torikobito/archive/2008/01/23/118909.aspx" target=_blank mce_href="http://blogs.wankuma.com/torikobito/archive/2008/01/23/118909.aspx"&gt;Nella seconda parte del post&lt;/A&gt; procederò con il descrivere questa parte dell'implementazione del MVC Framework con qualche approfondimento anche sull'infrastruttura di routing.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7152141" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>Articoli sulle nuove funzionalità di WCF e IIS 7</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2007/12/27/articoli-sulle-nuove-funzionalit-di-wcf-e-iis-7.aspx</link><pubDate>Thu, 27 Dec 2007 15:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6876918</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/6876918.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=6876918</wfw:commentRss><description>&lt;P&gt;Breve post per segnalare due interessanti articoli presenti su MSDN Magazine di Gennaio. Il primo è relativo al nuovo supporto per WCF in .NET 3.5 per i Web Service stile REST e le funzionalità di Syndications—RSS :&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://msdn.microsoft.com/msdnmag/issues/08/01/WCFinOrcas/default.aspx" mce_href="http://msdn.microsoft.com/msdnmag/issues/08/01/WCFinOrcas/default.aspx"&gt;http://msdn.microsoft.com/msdnmag/issues/08/01/WCFinOrcas/default.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Il secondo&amp;nbsp;articolo è relativo alla nuova pipeline di IIS 7 :&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;A href="http://msdn.microsoft.com/msdnmag/issues/08/01/PHPandIIS7/default.aspx" mce_href="http://msdn.microsoft.com/msdnmag/issues/08/01/PHPandIIS7/default.aspx"&gt;http://msdn.microsoft.com/msdnmag/issues/08/01/PHPandIIS7/default.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6876918" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category></item><item><title>ASP.NET e paginazione dei dati con le Grid</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2007/05/21/asp-net-e-paginazione-dei-dati-con-le-grid.aspx</link><pubDate>Mon, 21 May 2007 10:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2763307</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/2763307.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=2763307</wfw:commentRss><description>&lt;P&gt;Mi capita spesso di incontrare gruppi di sviluppo che lavorano con ASP.NET e che lamentano problemi di performace che poi ad una analisi più approfondita , risultano essere dipendenti dall'utilizzo di tecniche di paginazione scorrette su tabelle o viste di dati contenenti una grande quantità di righe. Le problematiche più ricorrenti riguardano un uso scorretto del meccanismo automatico di paginazione e del ViewState (a volte addirittura memorizzato nella sessione) . Di seguito segnalo alcune risorse utili ad indirizzare questo tipo di problematiche in modo corretto, mantendo buona parte degli automatismi forniti dai controlli ASP.NET:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Paginazione in SQL Server 2000 ed altri cosigli sulle performance&amp;nbsp;&lt;FONT face=Calibri size=3&gt;articolo datato ma con spunti utilissimi:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;A href="http://msdn.microsoft.com/msdnmag/issues/05/01/ASPNETPerformance/default.aspx" mce_href="http://msdn.microsoft.com/msdnmag/issues/05/01/ASPNETPerformance/default.aspx"&gt;&lt;FONT face=Calibri size=3&gt;http://msdn.microsoft.com/msdnmag/issues/05/01/ASPNETPerformance/default.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: EN-US"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;Control State - View State&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: EN-US"&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/z1hkazw7.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/z1hkazw7.aspx"&gt;&lt;FONT face=Calibri size=3&gt;http://msdn2.microsoft.com/en-us/library/z1hkazw7.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN lang=EN-US style="mso-ansi-language: EN-US"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT face=Calibri size=3&gt;Paging Data usando Sql 2005 ROW:NUMBER()&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;A href="http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx" mce_href="http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx"&gt;&lt;FONT face=Calibri size=3&gt;http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2763307" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item></channel></rss>