<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//cradle//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2013 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2013.6.5</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Fri, 02 Mar 2012 09:05:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//cradle//</link></image><item><title>Visual Studio 11 beta: le novit&amp;#224; di ASP.NET MVC 4 e ASP.NET Web Pages 2.0</title><link>http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx</link><pubDate>Fri, 02 Mar 2012 09:05:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2749" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Se ASP.NET MVC 3 ha rappresentato il consolidamento di un framework oramai maturo e idoneo a essere utilizzato in scenari avanzati, con la nuova versione, &lt;strong&gt;ASP.NET MVC 4&lt;/strong&gt; introduce una serie di migliorie volte a supportare nativamente una serie di contesti, quali ad esempio la realizzazione di servizi REST e lo sviluppo di applicazioni web mobile, in cui l'utilizzo di ASP.NET MVC risulta molto comodo e naturale.&lt;/p&gt; &lt;p&gt;La prima grossa novità è rappresentata da &lt;strong&gt;WebAPI&lt;/strong&gt;, ossia un'estensione tramite la quale possiamo realizzare servizi di tipo &lt;strong&gt;REST&lt;/strong&gt; scrivendo davvero poco codice: ereditando dalla nuova classe ApiController, infatti, il framework predispone una serie di regole di routing basate su convenzioni di naming; le action, che corrispondono alle operation dei servizi, sono così direttamente invocabili da un client, che può essere javascript, Windows Phone, o altro, e restituiscono dati in formato &lt;strong&gt;JSON &lt;/strong&gt;o &lt;strong&gt;XML&lt;/strong&gt;. L'aspetto interessante è che questi particolari controller vengono comunque eseguiti dall'infrastruttura di ASP.NET MVC, e pertanto possono avvalarsi di funzionalità già presenti quali &lt;strong&gt;Action Filter&lt;/strong&gt;, &lt;strong&gt;Model Binder&lt;/strong&gt; e &lt;strong&gt;Routing&lt;/strong&gt;. Eventualmente, ma non è un requisito, è possibile sfruttare questa tipologia di servizi per realizazre Single Page Application, applicazioni cioè costituite da una singola pagina, che modifica il suo contenuto in maniera dinamica, comportantosi insomma come&lt;strong&gt; un vero e proprio smart client&lt;/strong&gt;. In questo senso è anche presente un supporto sperimentale in ASP.NET MVC sotto forma di un particolare template.&lt;/p&gt; &lt;p&gt;Parlando di template, anche in questo senso sono state apportate delle migliorie, volte soprattutto a rendere più moderni quelli esistenti (che ora sono tutti in formato HTML 5 standard) e a supportare sin da subito i &lt;strong&gt;dispositivi mobile&lt;/strong&gt;. In particolare, &lt;strong&gt;jQuery Mobile&lt;/strong&gt; è incluso di default nei template di progetto, ed è ora più semplice realizzare view specifiche per i dispositivi. E' stato introdotto anche il concetto di &lt;strong&gt;DisplayMode&lt;/strong&gt;, tramite il quale identificare view differenti in base alla tipologia del browser. Anche Razor è cresciuto in questa nuova versione, aggiungendo funzionalità per rendere più sintetica l'inclusione degli script.&lt;/p&gt; &lt;p&gt;Sul fronte &lt;strong&gt;ASP.NET Web Pages 2.0&lt;/strong&gt;, invece, oltre a molto di quanto già detto per ASP.NET MVC (Razor,template mobile) si aggiunge anche il supporto alle API di &lt;strong&gt;un gran numero&lt;/strong&gt; di servizi esterni, utili ad esempio per la gestione dell'autenticazione, che includono OAuth, OpenID e le nuove API di Facebook, Twitter, ecc. E inoltre presente il nuovo helper &lt;strong&gt;Map&lt;/strong&gt;, che consente di integrare con semplicità mappe di Google, Bing o Yahoo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.5/" rel="tag"&gt;.NET Framework 4.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.5/" rel="tag"&gt;ASP.NET 4.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio_2012/" rel="tag"&gt;Visual Studio 2012&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/WebMatrix/" rel="tag"&gt;WebMatrix&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_8/" rel="tag"&gt;Windows 8&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx"&gt;&lt;em&gt;Visual Studio 11 beta: le novit&amp;#224; di ASP.NET MVC 4 e ASP.NET Web Pages 2.0&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.5, ASP.NET 4.5, Visual Studio 2012, WebMatrix, Windows 8, Windows Client</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2749/Visual-Studio-11-Beta-Novita-ASP.NET-MVC-ASP.NET-Web.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2749.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2749</trackback:ping></item><item><title>WPC 2011: Cosa mi/ci/vi aspetta!</title><link>http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx</link><pubDate>Mon, 14 Nov 2011 07:01:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2721" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;p&gt;Quest'anno sono davvero orgoglioso di essere riuscito a salire a bordo della&lt;strong&gt; più importante conference IT italiana&lt;/strong&gt;: è infatti per me un grande onore essere uno degli speaker di WPC 2011, dove terrò una sessione nella giornata del 23 (poco prima di Ibraaaaaa!!).&lt;/p&gt;&lt;p&gt;Di cosa parlerò? Beh, di un argomento che, con il passare degli anni e delle versioni, mi appassiona sempre di più, tanto da averci scritto un libro e da non smettere di consigliarlo a varie aziende presso le quali collaboro: ovviamente si tratta di &lt;strong&gt;ASP.NET MVC&lt;/strong&gt;, e in particolare delle possibilità di &lt;strong&gt;estensione &lt;/strong&gt;e &lt;strong&gt;customizzazione &lt;/strong&gt;che ci offre.&lt;/p&gt;&lt;p&gt;Secondo me, infatti, al di là delle migliorie sul view engine, i global filters, ecc. ecc., la&lt;strong&gt; vera carta vincente &lt;/strong&gt;di ASP.NET MVC è proprio costituita dalla sua &lt;strong&gt;architettura&lt;/strong&gt;, pluggabile in diversi punti, tanto da riuscire a piegarla alle nostre esigenze particolari davvero con poco sforzo e con risultati sorprendenti, soprattutto dal punto di vista della semplicità e della pulizia del codice. Certo, si tratta di feature che sicuramente sfuggono ad una prima occhiata, fornendoci quindi l'errata impressione di un framework che, sì, dà controllo assoluto sul markup, ma che allo stesso tempo sembra essere verboso e ripetitivo (&amp;quot;sì, ma dove sono gli user control? e i datasource??).&lt;/p&gt;&lt;p&gt;Eppure, con un approccio diverso, magari giusto un pelo più ragionato, e con gli strumenti giusti, possiamo davvero scatenare&lt;strong&gt; a tutta forza&lt;/strong&gt; la potenza di ASP.NET MVC. Se riuscite, fate un salto ad Assago il 23 e ne parleremo insieme! E dopo... Ibrahimovic vs. Messi...&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Architettura/" rel="tag"&gt;Architettura&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework_4.1/" rel="tag"&gt;Entity Framework 4.1&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Pattern/" rel="tag"&gt;Pattern&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx"&gt;&lt;em&gt;WPC 2011: Cosa mi/ci/vi aspetta!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.0, Architettura, ASP.NET MVC, Cache, Entity Framework 4.1, jQuery, Pattern</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2721/WPC-2011-Aspetta.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2721.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2721</trackback:ping></item><item><title>CDays10, the day after: ringraziamenti, precisazioni, tricchettracc e bombamman</title><link>http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx</link><pubDate>Sat, 18 Dec 2010 12:17:33 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2671" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Sto scrivendo queste righe mentre sono su un treno che mi riporta in Abruzzo, dopo che Ryanair ha pensato bene di cancellare il mio volo di ieri sera (insieme a quelli di un altro migliaio di passeggeri). bah.&lt;/p&gt; &lt;p&gt;Anyway, innanzitutto volevo ringraziare tutti i partecipanti ai &lt;a href="http://www.communitydays.it/events/communitydays2010-milano.aspx" target="_blank"&gt;Community Days 2010&lt;/a&gt;, in particolar modo quelli che sono rimasti ad ascoltare la mia sessione e quella di &lt;a href="http://blogs.ugidotnet.org/pape/Default.aspx" target="_blank"&gt;Andrea&lt;/a&gt;, nonostante l'incognita della neve e della percorribilità delle strade. Non ho parole, grazie sul serio, spero che ciò che vi ho mostrato di Web Forms possa in qualche modo esservi utile e serva a ripagare la vostra pazienza! &lt;img alt="Smile" src="http://blogs.aspitalia.com/img/cradle/windows-live-writer/cd2010_b56c/wlemoticon-smile_2.png" /&gt;&lt;/p&gt; &lt;p&gt;Durante la sessione ho notato parecchio interesse, soprattutto attorno alle nuove funzionalità di &lt;strong&gt;Dynamic Data&lt;/strong&gt;, che secondo me rappresentano una vera rivoluzione nell'ambito di *come* scrivere un'applicazione web forms oggi. Mi fa piacere perchè non nascondo la mia passione per DynData, cercherò di utilizzare questo feedback anche in ottica di tuning degli script per il 2011.&lt;/p&gt; &lt;p&gt;Il medesimo interesse poi l'ho visto nella parte relativa alla &lt;strong&gt;cache&lt;/strong&gt;, peccato che &lt;strong&gt;AppFabric &lt;/strong&gt;abbia fatto le bizze e non mi abbia consentito di eseguire con successo tutte le demo che avevo preparato. Rimedierò con uno screencast al più presto, promesso! Quando parlo di &lt;em&gt;"fare le bizze"&lt;/em&gt; purtroppo intendo proprio &lt;em&gt;"fare le bizze"&lt;/em&gt;, nel senso che 10 minuti fa è bastato stoppare e riavviare il servizio perchè tutto funzionasse senza modificare una riga nel codice.. misteri sistemistici, con AppFabric siamo ancora alla versione 1.0 e magari c'è spazio ancora per qualche fix qua e là. Anyway, indagherò meglio e vi terrò aggiornati &lt;img alt="Winking smile" src="http://blogs.aspitalia.com/img/cradle/windows-live-writer/cd2010_b56c/wlemoticon-winkingsmile_2.png" /&gt;&lt;/p&gt; &lt;p&gt;Una risposta volante alla persona che mi ha chiesto della possibilità di invalidare elementi in cache in dipendenza da SQL Server: confermo che è possibile, la classe si chiama &lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.caching.sqlchangemonitor.sqlchangemonitor.aspx" target="_blank"&gt;SqlChangeMonitor&lt;/a&gt; e non è altro che un wrapper della precedente &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx" target="_blank"&gt;SqlDependency&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Slide e demo online prestissimo, le sto "impacchettando" or ora per spedirle a &lt;a href="http://blogs.aspitalia.com/daniele/" target="_blank"&gt;Daniele&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Sentitevi liberi di contattarmi per ogni genere di domanda, un saluto e ancora grazie!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Community_Days_2010/" rel="tag"&gt;Community Days 2010&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Dynamic_Data_Control/" rel="tag"&gt;Dynamic Data Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx"&gt;&lt;em&gt;CDays10, the day after: ringraziamenti, precisazioni, tricchettracc e bombamman&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework 4.0, ASP.NET 3.5, ASP.NET 4.0, Cache, Community Days 2010, Databinding, Dynamic Data Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2671/CDays10-The-Day-After-Ringraziamenti-Precisazioni-.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2671.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2671</trackback:ping></item><item><title>ASP.NET Web Forms ai Community Days, nel 2010</title><link>http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx</link><pubDate>Fri, 10 Dec 2010 10:25:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2668" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;A parte il riferimento temporale, un post con un simile titolo avrebbe potuto tranquillamente essere pubblicato 5 anni fa (se non fosse che allora i Community Days non erano stati ancora inventati :D ). Si sa, è usanza - ed entro certi limiti non c'è niente di male, beninteso - seguire le mode del momento, che vogliono ad esempio in ASP.NET MVC la piattaforma più gettonata di cui parlare quando si vuole affrontare l'argomento dello sviluppo per il Web.&lt;/p&gt;&lt;p&gt;E però esiste tanto ASP.NET Web Forms in giro, ad oggi la piattaforma più diffusa per realizzare Web App basate su .NET, e soprattutto, si tratta di una tecnologia &lt;strong&gt;estremamente moderna&lt;/strong&gt;: &lt;strong&gt;Routing&lt;/strong&gt;, &lt;strong&gt;Data Template&lt;/strong&gt;, &lt;strong&gt;Data Annotations&lt;/strong&gt;, &lt;strong&gt;controllo del markup&lt;/strong&gt;, sono concetti che spesso si associano alle View, ai Model e ai Controller, magari portandoci erroneamente a pensare che, se vogliamo avvalercene, ASP.NET MVC sia una scelta obbligata.&lt;/p&gt;&lt;p&gt;Ebbene, non è assolutamente vero, ed è la principale ragione per cui, secondo me, ha veramente tantissimo senso &lt;strong&gt;nel 2010&lt;/strong&gt; avere una sessione come &lt;strong&gt;WebForms.Reload()&lt;/strong&gt; nell'agenda dei &lt;strong&gt;Community Days&lt;/strong&gt; e, di riflesso, è per me un grandissimo piacere poterne parlare. Visto che poi non ci facciamo mancare niente, toccheremo anche l'argomento Performance, e in particolare quel gioiellino che è &lt;strong&gt;AppFabric&lt;/strong&gt;, su cui ad esempio è basata l'infrastruttura di cache dell'interno network &lt;strong&gt;ASPItalia&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Che dire, se ho stuzzicato la vostra curiosità, ci vediamo a Milano, giovedì e venerdì prossimi.&lt;/p&gt;&lt;p&gt;Ciauz!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Cache/" rel="tag"&gt;Cache&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Community_Days_2010/" rel="tag"&gt;Community Days 2010&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Dynamic_Data_Control/" rel="tag"&gt;Dynamic Data Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx"&gt;&lt;em&gt;ASP.NET Web Forms ai Community Days, nel 2010&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.0, ASP.NET 3.5, ASP.NET 4.0, Cache, Community Days 2010, Databinding, Dynamic Data Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2668/ASP.NET-Web-Forms-Community-Days-2010.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2668.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2668</trackback:ping></item><item><title>Inside ModelVirtualCasting #7: Come ti creo una form MVC in 20 secondi (a dire tanto...)</title><link>http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx</link><pubDate>Tue, 15 Jun 2010 05:50:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2640" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Settima puntata per questa serie su &lt;a href="http://modelvirtualcasting.aspitalia.com/"&gt;ModelVC&lt;/a&gt; che, se continua così, ci porteremo fin sotto all'ombrellone! Qualche link ai precedenti post prima di iniziare...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2627/Inside-ModelVirtualCasting-Sharp1-Introduzione-Repository.aspx"&gt;Introduzione ai repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2629/Inside-ModelVirtualCasting-Sharp2-Architettura-Interna-Repository.aspx"&gt;Architettura interna dei repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/daniele/post2630/Inside-ModelVirtualCasting-Sharp3-Cache.aspx"&gt;La cache&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/cradle/post2634/Inside-ModelVirtualCasting-Sharp4-Funziona-CacheThis.aspx"&gt;Come funziona CacheThis?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/ricciolo/post2636/Inside-ModelVirtualCasting-Sharp5-Servizi.aspx"&gt;I servizi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.aspitalia.com/daniele/post2637/Inside-ModelVirtualCasting-Sharp6-SEO-ASP.NET-4.0.aspx"&gt;SEO con ASP.NET 4.0&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Stavolta ci tocca il compito di sfatare un mito, ossia il fatto che con &lt;strong&gt;ASP.NET MVC&lt;/strong&gt; il codice da scrivere è verboso, lungo e, in parole povere, molto meno &lt;a href="http://en.wikipedia.org/wiki/Rapid_application_development"&gt;RAD&lt;/a&gt; di Web Forms. Niente di più falso, grazie all'introduzione in MVC 2 degli &lt;strong&gt;editor e visualizer templates&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Immaginiamo un'ipotetica form di inserimento dati. Mentre in Web Forms il fulcro centrale dell'interfaccia è costituito dall'insieme dei controlli, in MVC invece&lt;strong&gt; il ruolo di protagonista è recitato dal model&lt;/strong&gt;, e dagli oggetti che lo compongono. Si tratta, quindi, di un concetto &lt;strong&gt;molto più di &amp;quot;business&amp;quot;&lt;/strong&gt; rispetto al passato, in cui possiamo specificare che un oggetto di tipo DateTime deve essere ovunque rappresentato in un certo modo e modificato in un altro.&lt;/p&gt;&lt;p align="baseline"&gt;Gli editor e visualizer templates non fanno altro che rendere possibile questo livello di astrazione: possiamo immaginarli come delle &lt;strong&gt;mini-partial view&lt;/strong&gt;, che vengono associate ad un particolare tipo di dato grazie al nome e automaticamente iniettate dal framework quando lo si voglia visualizzare o modificare. In ModelVC, ad esempio, ho voluto utilizzare il &lt;a href="http://jqueryui.com/demos/datepicker/"&gt;DatePicker&lt;/a&gt; di &lt;a href="http://jqueryui.com/"&gt;jQueryUI&lt;/a&gt; come editor per tutte le proprietà di tipo &lt;strong&gt;DateTime&lt;/strong&gt; di qualsiasi model delle mie pagine. Per farlo, ho creato un template di nome &lt;strong&gt;DateTime.ascx&lt;/strong&gt; (occhio che il nome è importante) che ho messo nella posizione che vedete in figura.&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.aspitalia.com/img/Cradle/insidemodelvirtualcasting7formin20secondi/folders.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Ma cosa contiene DateTime.ascx?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;code&gt;&amp;lt;%@ Control Language=&amp;quot;C#&amp;quot; Inherits=&amp;quot;System.Web.Mvc.ViewUserControl&amp;quot; %&amp;gt;&lt;br /&gt;&amp;lt;script runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0;private string dateString&lt;br /&gt;&amp;#xa0;&amp;#xa0;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;get&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;if (this.Model == null)&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0;return null;&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;return ((DateTime)this.Model).ToShortDateString();&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;}&lt;br /&gt;&amp;#xa0;&amp;#xa0;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;%= Html.TextBox(&amp;quot;&amp;quot;, dateString, new { @class = &amp;quot;dateInput&amp;quot; })%&amp;gt;&lt;/code&gt;&lt;p&gt;Fondamentalmente niente di che, semplicemente una &lt;strong&gt;TextBox con una classe CSS&lt;/strong&gt; particolare (dateInput) che posso utilizzare nella master page per attivare il DatePicker su tutte quelle che ne fanno uso:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;code&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0;$(function () {&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;$.datepicker.setDefaults($.datepicker.regional['it']);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;$('.dateInput').datepicker();&lt;br /&gt;&amp;#xa0;&amp;#xa0;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;p&gt;Il risultato dell'aver definito questo template è che basta a questo punto scrivere&lt;/p&gt;&lt;code&gt;&amp;lt;%= Html.EditorFor(m =&amp;gt; m.BirthDate) %&amp;gt;&lt;/code&gt;&lt;p&gt;perché il nostro bell'editor custom venga utilizzato in luogo del normale box di testo, semplicemente perché BirthDate è di tipo DateTime (in realtà è anche possibile specificare esplicitamente quale editor referenziare tramite le &lt;strong&gt;DataAnnotations&lt;/strong&gt;).&lt;/p&gt;&lt;p&gt;Non male, vero? Ma l'aspetto più interessante è che, dato che da che mondo è mondo, in .NET &lt;strong&gt;tutto eredita da Object&lt;/strong&gt;, e nulla mi vieta di realizzare un bel template Object.ascx, che magari &lt;strong&gt;cicli per tutte le proprietà di un oggetto&lt;/strong&gt; e per ognuna di esse renderizzi l'opportuno editor, magari di nuovo di tipo Object. Morale della favola: ho l'oggetto &lt;strong&gt;Candidate&lt;/strong&gt;, che referenzia alcune altre entity e diversi complex type e voglio realizzarne una form di edit; bene, non devo far altro che scrivere&lt;/p&gt;&lt;code&gt;&amp;lt;%= Html.EditorFor(m =&amp;gt; m) %&amp;gt;&lt;/code&gt;&lt;p&gt;o ancora meglio&lt;/p&gt;&lt;code&gt;&amp;lt;%= Html.EditorForModel() %&amp;gt;&lt;/code&gt;&lt;p&gt;Come ho fatto? Andate a vederlo sul &lt;a href="http://modelvirtualcasting.codeplex.com/releases/view/46151"&gt;codice sorgente di ModelVC&lt;/a&gt; e nel frattempo, provate anche a vedere se riuscite con Web Forms a realizzare una form altrettanto velocemente ;-)&lt;/p&gt;&lt;p&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Custom_Control/" rel="tag"&gt;Custom Control&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/jQuery/" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Model_Virtual_Casting/" rel="tag"&gt;Model Virtual Casting&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/User_Control/" rel="tag"&gt;User Control&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx"&gt;&lt;em&gt;Inside ModelVirtualCasting #7: Come ti creo una form MVC in 20 secondi (a dire tanto...)&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework 4.0, ASP.NET 4.0, ASP.NET MVC, Custom Control, jQuery, Model Virtual Casting, User Control</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2640/Inside-ModelVirtualCasting-Sharp7-Creo-Form-MVC-20-A-Dire.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2640.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2640</trackback:ping></item><item><title>Creare un filtro custom per QueryExtender</title><link>http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx</link><pubDate>Mon, 03 May 2010 13:40:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2618" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;QueryExtender &lt;/strong&gt;è uno strumento molto comodo per modificare le query generate da una &lt;strong&gt;EntityDataSource &lt;/strong&gt;e ciò che lo rende secondo me parecchio potente è la sua espandibilità.&lt;/p&gt;&lt;p&gt;Creare filtri personalizzati è infatti parecchio semplice se si ha un po' di dimistichezza con le lambda expression, visto che, in fin dei conti, non dobbiamo far altro che generare l'espressione desiderata e applicarla alla sorgente. Vediamo un po' nel dettaglio come fare, ad esempio, a realizzare un filtro in cui possiamo specificare il tipo di relazione (&amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, ecc.) e il termine di comparazione.&lt;/p&gt;&lt;p&gt;Il primo passo è quello di realizzare una classe che erediti da &lt;strong&gt;DataSourceExpression &lt;/strong&gt;o meglio, dato che il nostro filtro dovrà essere parametrico, da &lt;strong&gt;ParameterDataSourceExpression&lt;/strong&gt;, che implementa già tutta la logica necessaria a recuperare i valori dei parametri.&lt;/p&gt;&lt;p&gt;L'unico metodo da realizzare è &lt;strong&gt;GetQueryable&lt;/strong&gt;, che riceve in ingresso un oggetto &lt;strong&gt;IQueryable &lt;/strong&gt;e lo restituisce dopo averne eventualmente modificato l'espressione:&lt;/p&gt;&lt;code&gt;public override IQueryable GetQueryable(IQueryable source)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0;// recupero i parametri grazie alla logica della classe base&lt;br /&gt;&amp;#xa0;&amp;#xa0;var values = this.Parameters.GetValues(this.Context, this.Owner);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0;// se non tutti i parametri sono specificati, non faccio nulla&lt;br /&gt;&amp;#xa0;&amp;#xa0;if (values.Count != 2 || values[0] == null || values[1] == null)&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;return null;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0;// .. qui logica per calcolare il filtro ..&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;L'aspetto, se vogliamo, leggermente complesso, è costruire la &lt;strong&gt;LambdaExpression&lt;/strong&gt;, dato che richiede un po' di conoscenza dell'anatomia di questo tipo di oggetti. Immaginiamo di voler scrivere questo tipo di espressione sull'oggetto &lt;strong&gt;Product &lt;/strong&gt;e cerchiamo di capire come scomporla:&lt;/p&gt;&lt;code&gt;p =&amp;gt; p.Amount &amp;lt; 25&lt;/code&gt;&lt;p&gt;Essa contiene:&lt;/p&gt;&lt;p&gt;1) Una &lt;strong&gt;costante &lt;/strong&gt;&amp;quot;25&amp;quot;&lt;/p&gt;&lt;code&gt;var constant = Expression.Constant(25, typeof(int));&lt;/code&gt;&lt;p&gt;2) Un &lt;strong&gt;parametro &lt;/strong&gt;&amp;quot;p&amp;quot; di tipo Product&lt;/p&gt;&lt;code&gt;var parameterExpression = Expression.Parameter(typeof(Product));&lt;/code&gt;&lt;p&gt;3) L'&lt;strong&gt;accesso alla proprietà&lt;/strong&gt; &amp;quot;Amount&amp;quot; di Product&lt;/p&gt;&lt;code&gt;var propertyExpression = Expression.PropertyOrField(parameterExpression, &amp;quot;Amount&amp;quot;);&lt;/code&gt;&lt;p&gt;4) Il &lt;strong&gt;confronto &lt;/strong&gt;&amp;quot;&amp;lt;&amp;quot; tra il risultato del punto (3) e quello del punto (1)&lt;/p&gt;&lt;code&gt;var compare = Expression.LessThan(propertyExpression, constant);&lt;/code&gt;&lt;p&gt;Questo oggetto è il &lt;strong&gt;body &lt;/strong&gt;della nostra lambda expression, ossia tutto ciò che è &lt;strong&gt;a destra&lt;/strong&gt; del simbolo &amp;quot;=&amp;gt;&amp;quot;. Per ottenere l'espressione completa è sufficiente specificare quali sono i &lt;strong&gt;parametri &lt;/strong&gt;che essa dovrà gestire, ossia i membri &lt;strong&gt;a sinistra&lt;/strong&gt; del simbolo &amp;quot;=&amp;gt;&amp;quot; (nel nostro caso Product, e quindi la stessa parameterExpression del punto 2):&lt;/p&gt;&lt;code&gt;var lambda = Expression.Lambda(compare, new ParameterExpression[] { parameterExpression });&lt;/code&gt;&lt;p&gt;Mettendo tutto insieme, il metodo GetQueryable diviene:&lt;/p&gt;&lt;code&gt;public override IQueryable GetQueryable(IQueryable source)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var values = this.Parameters.GetValues(this.Context, this.Owner);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;if (values.Count != 2 || values[0] == null || values[1] == null)&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0;return null;&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// recupero la property su cui effettuare il filtro&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var parameterExpression =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Parameter(source.ElementType);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var propertyExpression =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.PropertyOrField(parameterExpression, this.DataField);&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// creo il secondo membro dell'expression in base al valore recuperato&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;TypeConverter converter =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;TypeDescriptor.GetConverter(propertyExpression.Type);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var constant =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Constant(converter.ConvertFrom(values[1]), propertyExpression.Type);&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// creo l'espressione di confronto&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var comparisonType = getComparisonType((string)values[0]);&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var compare =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;buildCompareExpression(propertyExpression, comparisonType, constant);&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;// genero la lambdaexpression&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;var lambda =&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Lambda(compare, new ParameterExpression[] { parameterExpression });&lt;br /&gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0;return source.Provider.CreateQuery(&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0;Expression.Call(&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0;typeof(Queryable), &amp;quot;Where&amp;quot;,&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; new Type[] { source.ElementType },&amp;#xa0;&lt;br /&gt;&amp;#xa0;&amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; &amp;#xa0; new Expression[] { source.Expression, Expression.Quote(lambda) }));&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Alcune cose da notare:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;L'uso di un &lt;strong&gt;TypeConverter &lt;/strong&gt;per convertire il parametro nel tipo desiderato da Expression.Constant;&lt;/li&gt;&lt;li&gt;Il metodo buildCompareExpression non fa altro che valutare l'operatore selezionato dall'utente (&amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;, ecc.) e costruire l'espressione corrispondente (&amp;quot;Expression.LessThan&amp;quot;, &amp;quot;Expression.GreaterThan&amp;quot;)&lt;/li&gt;&lt;li&gt;L'uso di &lt;strong&gt;Expression.Call&lt;/strong&gt; e di &lt;strong&gt;IQueryProvider.CreateQuery&lt;/strong&gt; per aggiungere una condizione di Where alla IQueryable originale. Questo è necessario perché l'extension method Where è generico e quindi richiede di specificare il tipo, che però nel nostro caso non è noto a priori.&lt;/li&gt;&lt;li&gt;Il fatto che abbiamo realizzato un filtro Where è un qualcosa di strettamente correlato alla nostra particolare implementazione, visto che &lt;strong&gt;non esistono vincoli infrastrutturali&lt;/strong&gt; in tal senso. Morale della favola: nulla ci vieta di implementare una DataSourceExpression per realizzare una Group By.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Il codice dell'esempio è scaricabile &lt;a href="http://blogs.aspitalia.com/img/Cradle/demo_queryextender_filtro_personalizzato/WebApplication3.zip"&gt;qui&lt;/a&gt;, per farlo funzionare vi basta sostituire la connection string con una che punti al database Northwind.&lt;/p&gt;&lt;p&gt;Ciao!&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Databinding/" rel="tag"&gt;Databinding&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Entity_Framework/" rel="tag"&gt;Entity Framework&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx"&gt;&lt;em&gt;Creare un filtro custom per QueryExtender&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework 4.0, ASP.NET 4.0, Databinding, Entity Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx</guid><slash:comments>8</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2618/Creare-Filtro-Custom-QueryExtender.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2618.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2618</trackback:ping></item><item><title>ASP.NET MVC 2, ne vale la pena? Secondo me s&amp;#236;!</title><link>http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx</link><pubDate>Wed, 28 Apr 2010 05:53:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2614" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;Diciamolo chiaramente: per chi oramai sono anni che lavora con WebForms, passare ad ASP.NET MVC sulle prime può sembrare un ritorno alle origini (se va bene) o un great pain in the ass (se ci siamo svegliati con la luna storta).&lt;/p&gt; &lt;p&gt;Eppure la versione 2, che è disponibile - vale la pena ricordarlo - sia per &lt;strong&gt;Visual Studio 2010&lt;/strong&gt; che per &lt;strong&gt;Visual Studio 2008&lt;/strong&gt;, di novità ne ha portate parecchie, soprattutto dal punto di vista della &lt;strong&gt;produttività&lt;/strong&gt;: strano a dirsi, eh? e invece no! ASP.NET MVC 2 adotta un sistema di templating e di validazione mutuato - udite udite - da ASP.NET Dynamic Data Controls, grazie al quale possiamo &lt;strong&gt;realizzare interfacce complete e complesse veramente nel giro di pochissimo tempo&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Non ci credete? Beh, è una prima ragione per &lt;a href="http://www.aspitalia.com/eventi/27/Real-Code-Conference-4.0-Firenze.aspx"&gt;vederci a Firenze il 25 maggio&lt;/a&gt;, non trovate?&lt;/p&gt; &lt;p&gt;&amp;quot;Sì&amp;quot;, direte voi, &amp;quot;ottimo. Ma *perché* ASP.NET MVC? Chi me lo fa fare?&amp;quot;&lt;/p&gt; &lt;p&gt;La risposta è, ironia su ironia, un'altra domanda: &amp;quot;Scrivete &lt;strong&gt;test automatici&lt;/strong&gt; per il vostro codice?&amp;quot; &lt;/p&gt; &lt;p&gt;Se sì, magari parliamo di come testate le vostre pagine WebForms, giuro che mi interessa! E comunque valutate ASP.NET MVC, può veramente semplificare il vostro lavoro!&lt;/p&gt; &lt;p&gt;Se no, prendete in *seria* considerazione l'idea di iniziare! Magari proprio con ASP.NET MVC 2!&lt;/p&gt; &lt;p&gt;In entrambi i casi, proprio il testing è la seconda ragione per &lt;a href="http://www.aspitalia.com/eventi/27/Real-Code-Conference-4.0-Firenze.aspx"&gt;vederci a Firenze il 25 maggio&lt;/a&gt;. Perché secondo me parlare di MVC senza far vedere il testing è come andare a cena al ristorante e pagare il conto senza mangiare.&lt;/p&gt; &lt;p&gt;Morale della favola: ho pensato che alla &lt;a href="http://www.aspitalia.com/eventi/27/Real-Code-Conference-4.0-Firenze.aspx"&gt;Real Code Conference 4.0&lt;/a&gt; sarebbe stato interessante far vedere come scrivere un'applicazione real world con ASP.NET MVC 2 e decorarla con una bella suite di test automatici per ognuno dei suoi layer. D'altronde siamo nel 2010 no?&lt;/p&gt; &lt;p&gt;Ciao!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx"&gt;&lt;em&gt;ASP.NET MVC 2, ne vale la pena? Secondo me s&amp;#236;!&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, ASP.NET MVC</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2614/ASP.NET-MVC-Vale-Pena-SI.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2614.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2614</trackback:ping></item><item><title>.NET Framework 4.0 Beta 2: ASP.NET MVC 2 Preview 2</title><link>http://blogs.aspitalia.com/cradle/post2553/.NET-Framework-4.0-Beta-2-ASP.NET-MVC-Preview.aspx</link><pubDate>Wed, 21 Oct 2009 13:11:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2553" border="0" style="width:1px; height:1px;" /&gt;
&lt;p&gt;ASP.NET MVC 2 ha purtroppo mancato l'appuntamento con la prima beta release di Visual Studio 2010, per cui c'è veramente tanto da dire su quanto è stato incluso nella Beta 2.&lt;/p&gt;&lt;h3&gt;ModelMetadata e Model Validation&lt;/h3&gt;&lt;p&gt;Una prima novità è rappresentata dall'introduzione dei ModelMetadata, vale a dire un'infrastruttura per associare metadati ad un model che consente, ad esempio, di specificare la formattazione secondo cui mostrare a video una property, la sua descrizione o indicare un'insieme di validatori che ne verifichino la consistenza. &lt;br /&gt;Quest'infrastruttura è completamente provider-based: ASP.NET MVC 2 fornisce già un DataAnnotationsMetadataProvider che consente di recuperare queste informazioni tramite le DataAnnotations introdotte in ASP.NET Dynamic Data, ma è possibile realizzare propri provider per recuperarle da una qualsiasi sorgente (XML, Database, ecc.).&lt;br /&gt;Un ulteriore plauso va anche all'aggiunta di un supporto ufficiale alla validazione lato client, realizzata tramite jQuery e, ancora una volta, impostabile in maniera del tutto dichiarativa direttamente sul model tramite l'infrastruttura di DataAnnotiations.&lt;/p&gt;&lt;h3&gt;HttpVerb override&lt;/h3&gt;&lt;p&gt;Come sappiamo, già dalla prima versione di MVC è possibile specificare a quali verbi Http (GET, POST, PUT, DELETE) debba rispondere una action. Essi sono molto utili nel caso si voglia utilizzare ASP.NET MVC per esporre servizi REST, mentre il loro utilizzo rimane di fatto molto limitato nell'ambito di applicazioni con interfaccia utente, dato che i browser tipicamente utilizzano solo GET e POST.&lt;br /&gt;ASP.NET MVC 2 introduce un nuovo Html Helper, chiamato HttpMethodOverride, che può essere utilizzato in una view per renderizzare un particolare campo Hidden:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;form action=&amp;quot;/sampleDeleteAction&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; &amp;lt;%= Html.HttpMethodOverride(HttpVerbs.Delete) %&amp;gt;&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; ...&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;L'effetto è quello di sovrascrivere l'effettivo verbo inviato dal browser (nella fattispecie, un POST) con un DELETE, scatenando quindi l'esecuzione di una action decorata con HttpDeleteAttribute:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;[HttpDelete]&lt;br /&gt;public ActionResult SampleDeleteAction(...)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0; // ... more code here&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Tutto questo per fare cosa? Semplice: se esponiamo API di tipo REST e magari gestiamo tutti i verbi Http e non solo Get e Post, possiamo comunque continuare a riutilizzare i medesimi controller anche quando invece interagiamo con un browser.&lt;/p&gt;&lt;h3&gt;Single-Project Areas&lt;/h3&gt;&lt;p&gt;Già in ASP.NET MVC 2 Preview 1 era stato introdotto il concetto di Project Areas, tramite le quali era possibile suddividere un'applicazione di grandi dimensioni in diversi progetti Visual Studio indipendenti. La preview 2 amplia questa funzionalità tramite le Single Project Areas, ossia suddivisioni logiche dell'applicazione (e quindi controller, model, view e regole di routing indipendenti) all'interno dello stesso progetto.&lt;br /&gt;Maggiori informazioni sul concetto di Area possono essere reperite in &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/07/31/asp-net-mvc-v2-preview-1-released.aspx"&gt;questo post&lt;/a&gt; di Scott Guthrie, relativo alla vecchia Preview 1.&lt;/p&gt;&lt;h3&gt;Html Encoding Code Block&lt;/h3&gt;&lt;p&gt;Il metodo più sicuro per evitare attacchi di script injection nella propria web application è quello di effettuare l'HtmlEncode di qualsiasi dato potenzialmente a rischio nell'ambito del rendering di una view. Utilizzando la sintassi compatta&lt;br /&gt;&lt;code&gt;First Name: &amp;lt;%: Model.FirstName %&amp;gt;&lt;br /&gt;Last Name: &amp;lt;%: Model.FirstName %&amp;gt;&lt;/code&gt;&lt;br /&gt;l'engine di rendering della view si occupa di eseguire in maniera del tutto trasparente questo passaggio. Per approfondire, si veda &lt;a href="http://haacked.com/archive/2009/09/25/html-encoding-code-nuggets.aspx"&gt;questo post&lt;/a&gt; sul blog di Phil Haack.&lt;/p&gt;&lt;h3&gt;Non finisce qui!&lt;/h3&gt;&lt;p&gt;In aggiunta a quanto indicato sino ad ora, ASP.NET MVC 2 Preview 2 propone anche tutta una serie di migliorie, bug fix e performance improvements che sono descritte, analogamente a queste nuove funzionalità, nelle release notes ufficiali, scaricabili a &lt;a href="http://go.microsoft.com/fwlink/?LinkID=157066"&gt;questo indirizzo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Per maggiori informazioni sulle altre tecnologie all'interno del .NET Framework 4.0 si può fare riferimento al &lt;a href="http://www.aspitalia.com/focuson/1126/visual-studio-2010-.net-framework-4.0-beta-data-release.aspx"&gt;nostro speciale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/cradle/post2553/.NET-Framework-4.0-Beta-2-ASP.NET-MVC-Preview.aspx"&gt;&lt;em&gt;.NET Framework 4.0 Beta 2: ASP.NET MVC 2 Preview 2&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2013 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Marco De Sanctis</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.0, ASP.NET 4.0, ASP.NET MVC, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/cradle/post2553/.NET-Framework-4.0-Beta-2-ASP.NET-MVC-Preview.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/cradle/post2553/.NET-Framework-4.0-Beta-2-ASP.NET-MVC-Preview.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/cradle/CommentRSS2553.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2553</trackback:ping></item></channel></rss>