<?xml version="1.0" encoding="iso-8859-1"?><feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="it-it"><title>PeppeDotNet Blog - Category: ASP.NET</title><link rel="alternate" type="text/html" href="http://www.peppedotnet.it/Blog/"/><tagline type="text/html">www.peppedotnet.it/Blog/</tagline><id>http://www.peppedotnet.it/Blog/</id><modified>2011-12-29T12:41:0+01:00</modified><author><name>Marchi Giuseppe</name><url>http://www.peppedotnet.it/Blog/</url></author><entry><title>Vulnerabilit&#224; di ASP.NET del 28 dicembre 2011, in grado di causare un DoS</title><id>/Blog/ASPNETVulnerability28December2011.aspx</id><created>2011-12-29T12:41:0+01:00</created><content type="text/html" mode="escaped">Ieri (28 dicembre 2011) è uscito l'annuncio di una vulnerabilità di ASP.NET presente su tutte le versione del .NET Framework.
&lt;br /&gt;Se volete i dettagli, potete leggere tutto a questo indirizzo:
&lt;br /&gt;&lt;a href="http://technet.microsoft.com/en-us/security/advisory/2659883" title="" target="_blank"&gt;http://technet.microsoft.com/en-us/security/advisory/2659883&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;La vulnerabilità è legata all'utilizzo delle hash-table utilizzate in ambiente web. Attacchi che sfruttano questa tipologia di exploit, sono chiamati infatti "hash collision attacks" e hanno la peculiarità di cercare di provocare un denial of service popolando una o più collezioni di dati con una mole gigantesca di elementi.
&lt;br /&gt;
&lt;br /&gt;Dal blog di &lt;a href="http://weblogs.asp.net/scottgu/archive/2011/12/28/asp-net-security-update-shipping-thursday-dec-29th.aspx" title="Scott Guthrie" target="_blank"&gt;Scott Guthrie&lt;/a&gt; si evince che oggi (29 dicembre 2011, intorno alle ore 19:00 italiane) sarà rilasciata la patch per chiudere questo buco tramite Windows Update.
&lt;br /&gt;Quindi il consiglio è di aggiornare tutte le vostre macchine in cui girano applicazioni ASP.NET dalla versione 1.0 in poi.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Security.aspx" title="TAG: Security"&gt;Security&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/ASPNETVulnerability28December2011.aspx" /><issued>2011-12-29T12:41:0+01:00</issued><modified>2011-12-29T12:41:0+01:00</modified></entry><entry><title>Community Days 2012 - Milano, 16 e 17 febbraio 2012</title><id>/Blog/IscrivitiAiCommunityDays.aspx</id><created>2011-12-15T15:40:55+01:00</created><content type="text/html" mode="escaped">&lt;img src="http://www.peppedotnet.it/Images/communityDays600x220.png" alt="Community Days 2012" border="0" style="float:right; margin-left: 10px" /&gt;Vi avevo &lt;a href="http://www.peppedotnet.it/Blog/CommunityDays2010IscrizioniAperte.aspx" title="Primo avviso dei Community Days" target="_blank"&gt;già avvisato&lt;/a&gt; prima, ma ci tengo a ridirvelo.. che ASPItalia e UgiDotNet stanno organizzando veramente un gran bell'evento ;)
&lt;br /&gt;In soldoni.. SharePointCommunity.it, in collaborazione con le altre community ed user group italiani, partecipa e presenta il maggior evento community dell'anno: 12 track spalmate su 2 giorni interamenti dedicati alle ultime tecnologie, 4 lab ed i migliori speaker italiani.
&lt;br /&gt;
&lt;br /&gt;Windows 8, Windows Phone, Entity Framework, ASP.NET, .NET Framework 4.5 e Visual Studio 2011, applicazioni mobili, HTML 5 e tanto, tanto altro ancora!
&lt;br /&gt;
&lt;br /&gt;La partecipazione, come sempre, è totalmente gratuita. 
&lt;br /&gt;Le iscrizioni sono aperte e l'agenda è disponibile sul sito. ISCRIVETEVI SUBITO!
&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://www.communitydays.it/events/communitydays-2012/" title="Iscriviti ai Community Days 2012" target="_blank"&gt;http://www.communitydays.it/events/communitydays-2012/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Quest'anno parteciperò anche io come speaker, con una sessione sullo sviluppo in SharePoint 2010 per chi di voi proviene da ASP.NET; non potete mancare.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/Community Days.aspx" title="TAG: Community Days"&gt;Community Days&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint Community.aspx" title="TAG: SharePoint Community"&gt;SharePoint Community&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/IscrivitiAiCommunityDays.aspx" /><issued>2011-12-15T15:40:55+01:00</issued><modified>2011-12-15T15:40:55+01:00</modified></entry><entry><title>Community tour su SharePoint Online @ SMAU di Padova - 5 maggio 2011</title><id>/Blog/SharePointOnlineCommunityTourSMAUPadova.aspx</id><created>2011-4-26T17:50:28+01:00</created><content type="text/html" mode="escaped">&lt;div style="float: right; margin-left: 10px;"&gt;&lt;a title="SharePointCommunity.it - La community italiana per i professionisti SharePoint" href="http://www.sharepointcommunity.it" target="_blank"&gt;&lt;img alt="SharePointCommunity.it - La community italiana per i professionisti SharePoint" src="http://www.peppedotnet.it/Images/spCommunity.jpg"&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://www.powershell.it/ReusableItems/Graphics/News/sb11_logo_padova11.jpg" alt="SMAU PADOVA" /&gt;&lt;/div&gt;Per noi juventini il 5 maggio è solitamente una bella giornata :) e questa volta lo è anche per noi "SharePointiani".. 
&lt;br /&gt;&lt;a href="http://www.sharepointcommunity.it/news/Lists/Events/DispForm.aspx?ID=13" title="SharePoint Community @ SMAU Padova" target="_blank"&gt;SharePointCommunity.it&lt;/a&gt;, la community italiana per professionisti che lavorano su SharePoint, assieme a PowerShell.it (la community italiana su Windows PowerShell) partecipa al community tour di Microsoft presentando due sessioni durante lo &lt;a href="http://www.microsoft.com/italy/smau-business/default.aspx" title="SMAU Padova" target="_blank"&gt;SMAU di Padova&lt;/a&gt; il giorno 5 maggio 2011.
&lt;br /&gt;Nello specifico, io vi darò un'introduzione e un'anteprima di SharePoint Online (la piattaforma di collaborazione on the cloud, targata Office 365) e Francesco vi parlerà invece di virtualizzazione.
&lt;br /&gt;Questa l'agenda nel dettaglio:
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-decoration: underline"&gt;10:00 - 10:30&lt;/span&gt;
&lt;br /&gt;&lt;b&gt;Welcome e keynote - PierGiorgio Malusardi&lt;/b&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-decoration: underline"&gt;10:30 - 11:30&lt;/span&gt;
&lt;br /&gt;&lt;b&gt;SharePoint in the cloud - Giuseppe Marchi&lt;/b&gt;
&lt;br /&gt; In questa sessione cercheremo di conoscere l'offerta di Microsoft per quanto riguarda SharePoint in the cloud, all'interno del programma Office 365. Vedremo quali sono le principali caratteristiche e funzionalità del prodotto, le differenze rispetto alle normali installazioni on-premise e le modalità di gestione di contenuti e infrastruttura, assieme alle modalità di deployment di eventuali personalizzazioni. 
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-decoration: underline"&gt;11:30 - 12:30&lt;/span&gt;
&lt;br /&gt;&lt;b&gt;Virtualize a SharePoint 2010 Environment - Francesco Sodano&lt;/b&gt;
&lt;br /&gt;La virtualizzazione degli ambienti di sviluppo e produzione rappresentano ormai uno standard aziendale in molte società. In questa sessione si farà il punto su come è possibile virtualizzare un ambiente SharePoint 2010 su Microsoft Hyper-V (sia esso sviluppo o produzione), quali sono i vantaggi offerti e i punti di attenzione da tenere presente. Si mostrerà inoltre come creare una macchina virtuale SharePoint 2010 da utilizzare come template per SCVMM.
&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-decoration: underline"&gt;12:30 - 13:30&lt;/span&gt;
&lt;br /&gt;&lt;b&gt; Windows PowerShell 2.0 ed il remote management - Efran Cobisi&lt;/b&gt;
&lt;br /&gt;Il remote management è una delle novità più interessanti di PowerShell 2.0 e consente di gestire in completa autonomia e sicurezza le proprie macchine attraverso la rete, dalla riga di comando; non si tratta di un semplice sostituto di RCMD ma di una nuova ed articolata infrastruttura, costruita sulle basi del framework 
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;Per registrarvi dovete seguire questo link:
&lt;br /&gt;&lt;a href="http://www.smau.it/visitor/register/microsoft-07/" title="Iscritivi a SMAU Padova" target="_blank"&gt;http://www.smau.it/visitor/register/microsoft-07/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Vi aspettiamo ! ;)
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint.aspx" title="TAG: SharePoint"&gt;SharePoint&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint Online.aspx" title="TAG: SharePoint Online"&gt;SharePoint Online&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Office 365.aspx" title="TAG: Office 365"&gt;Office 365&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint Community.aspx" title="TAG: SharePoint Community"&gt;SharePoint Community&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/SharePointOnlineCommunityTourSMAUPadova.aspx" /><issued>2011-4-26T17:50:28+01:00</issued><modified>2011-4-26T17:50:28+01:00</modified></entry><entry><title>On-line l'agenda della SharePoint Conference 2011 !</title><id>/Blog/SPOC2011AgendaOnLine.aspx</id><created>2011-2-11T20:33:23+01:00</created><content type="text/html" mode="escaped">&lt;img style="margin: 2px; float: right" alt="SharePoint Conference 2011" src="http://www.peppedotnet.it/Images/SPOC2011_small.png" /&gt;Da pochi minuti è on-line l'&lt;a href="http://www.sharepointconference.it/events/2011/agenda.aspx" title"Agenda SharePoint Conference 2011" target="_blank"&gt;agenda&lt;/a&gt; della SharePoint Conference 2011, che si terrà il 19,20 e 21 Aprile 2011 qui a Milano.
&lt;br /&gt;
&lt;br /&gt;Queste le sessioni fin'ora pubblicate:
&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;ALL302&lt;/td&gt;&lt;td&gt;Dall'analisi all'architettura delle informazioni: i segreti per un progetto SharePoint di successo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ALL321&lt;/td&gt;&lt;td&gt;SharePoint Performance Tuning for Public web sites&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ALL322&lt;/td&gt;&lt;td&gt;Enterprise Project Management with SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI201&lt;/td&gt;&lt;td&gt;PowerPivot Architecture &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI202&lt;/td&gt;&lt;td&gt;DAX Introduction &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI203&lt;/td&gt;&lt;td&gt;BISM - BI Semantic Model &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI303&lt;/td&gt;&lt;td&gt;Business Intelligence in Microsoft SharePoint Server 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI304&lt;/td&gt;&lt;td&gt;Reporting Services 2008 R2 in SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI305&lt;/td&gt;&lt;td&gt;Excel Services in SharePoint 2010: Funzionalità e soluzioni &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI306&lt;/td&gt;&lt;td&gt;Common Patterns in PowerPivot &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BI442&lt;/td&gt;&lt;td&gt;Deploying PerformancePoint Services 2010 and PowerPivot Services 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CM201&lt;/td&gt;&lt;td&gt;Applying Web Design to a SharePoint Publishing Site &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CM321&lt;/td&gt;&lt;td&gt;Implementing Document Management Solutions with SharePoint 2010 and Office 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DAT301&lt;/td&gt;&lt;td&gt;Content Type Discovery using Dependency Structure Matrix Analysis &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DAT321&lt;/td&gt;&lt;td&gt;All around Metadata &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DAT422&lt;/td&gt;&lt;td&gt;Inside SharePoint Business Connectivity Services &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV301&lt;/td&gt;&lt;td&gt;Silverlight 4 and SharePoint 2010 get married! &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV302&lt;/td&gt;&lt;td&gt;Sandboxed Solutions in SharePoint &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV303 &lt;/td&gt;&lt;td&gt;5 ways to build a CRM application on top SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV321&lt;/td&gt;&lt;td&gt;Sviluppare Applicazioni con Windows Phone 7 e SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;
&lt;br /&gt;&lt;tr&gt;&lt;td&gt;DEV322 &lt;/td&gt;&lt;td&gt;Unit test and SharePoint, you can! &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV423&lt;/td&gt;&lt;td&gt;Developing a SharePoint 2010 Service Application &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV424&lt;/td&gt;&lt;td&gt;Troubleshooting e Debugging di applicazioni SharePoint &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DEV425&lt;/td&gt;&lt;td&gt;Il Client Object Model di SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;
&lt;br /&gt;&lt;tr&gt;&lt;td&gt;DEV425&lt;/td&gt;&lt;td&gt;SharePoint 2010 Workflow Development &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ENT201&lt;/td&gt;&lt;td&gt;Duet Enterprise overview &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ENT302&lt;/td&gt;&lt;td&gt;Building Enterprise Records Management Solutions for SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT321&lt;/td&gt;&lt;td&gt;SharePoint 2010 Administration Best Practices &lt;/td&gt;&lt;/tr&gt;
&lt;br /&gt;&lt;tr&gt;&lt;td&gt;IT322&lt;/td&gt;&lt;td&gt;Assicurare lunga vita alla propria SharePoint farm: logging, monitoring, throttling &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IT323&lt;/td&gt;&lt;td&gt;Configurazione e personalizzazione della User Profile Service Application &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OFF321&lt;/td&gt;&lt;td&gt;SharePoint Workspace and Business Connectivity Service: Collaboration without compromise &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OFF322&lt;/td&gt;&lt;td&gt;Access Service Development for SharePoint 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ONL201&lt;/td&gt;&lt;td&gt;Introduzione a Microsoft Office 365 &lt;/td&gt;&lt;/tr&gt;
&lt;br /&gt;&lt;tr&gt;&lt;td&gt;ONL302&lt;/td&gt;&lt;td&gt;Introduzione a SharePoint Online &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ONL303&lt;/td&gt;&lt;td&gt;SharePoint 2010 Communications with Lync 2010 &amp; Outlook 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ONL304 &lt;/td&gt;&lt;td&gt;Integrare SharePoint Server 2010 con Exchange Server 2010 &amp; Lync Server 2010: How-to &amp; Best Practice&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SB301 &lt;/td&gt;&lt;td&gt;XSLT, HTML, CSS, AJAX, jQuery... all you need to know! &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SB302&lt;/td&gt;&lt;td&gt;Costruire soluzioni complete con SharePoint 2010 senza scrivere codice &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SB321&lt;/td&gt;&lt;td&gt;Building Solutions with InfoPath 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SB322&lt;/td&gt;&lt;td&gt;Building Workflow Solutions with SharePoint 2010&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td&gt;SB421&lt;/td&gt;&lt;td&gt;Costruire un sito Internet con SharePoint 2010 in 60 minuti &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SEC321&lt;/td&gt;&lt;td&gt;Access Control Service e SharePoint &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SRC322&lt;/td&gt;&lt;td&gt;Personalizzare l'Enterprise Search in SharePoint Sever 2010 &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SRC323 &lt;/td&gt;&lt;td&gt;FAST for SharePoint 2010 vs Fast Search for Internet Site drill down &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;Per quanto riguarda l'iscrizione, ad oggi è scdauto il "super early bind" ma è ancora in vigore l'Early Bind che vi permette di risparmiare fino a 90 euro sul costo dell'iscrizione.
&lt;br /&gt;Vi ricordo che per iscriversi, potete compilare il form direttamente dal sito della conferenza:
&lt;br /&gt;&lt;a href="http://www.sharepointconference.it/events/2011/register.aspx" title="Iscrizione a SharePoint Conference 2011" target="_blank"&gt;http://www.sharepointconference.it/events/2011/register.aspx&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Forza forza !!
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint.aspx" title="TAG: SharePoint"&gt;SharePoint&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint 2010.aspx" title="TAG: SharePoint 2010"&gt;SharePoint 2010&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint Conference.aspx" title="TAG: SharePoint Conference"&gt;SharePoint Conference&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/SPOC2011AgendaOnLine.aspx" /><issued>2011-2-11T20:33:23+01:00</issued><modified>2011-2-11T20:33:23+01:00</modified></entry><entry><title>Security Advisory 2416728 (vulnerabilit&#224; in ASP.NET) e SharePoint 2010</title><id>/Blog/SecurityAdvisory2416728VulnerabilityInASPNETAndSharePoint.aspx</id><created>2010-9-21T15:53:8+01:00</created><content type="text/html" mode="escaped">Di recente Microsoft ha rilasciato un &lt;a href="https://www.microsoft.com/technet/security/advisory/2416728.mspx" title="Microsoft Security Advisory" target="_blank"&gt;Security Advisory&lt;/a&gt; in cui segnala un'importante vulnerabilità su qualsiasi versione di ASP.NET (dalla 1.1 alla 4.0) che è in grado, in condizioni particolari, di permettere anche l'accesso dei file da remoto.
&lt;br /&gt;Questa vulnerabilità ha pieno effetto se l'applicazione ASP.NET è stata configurata tramite web.config per mostrare l'errore completo.
&lt;br /&gt;Micorosft ha messo subito a disposizione uno &lt;a href="http://blogs.technet.com/b/srd/archive/2010/09/17/understanding-the-asp-net-vulnerability.aspx" title="Script per controllare se il tuo web.config è affetto dalla vulnerabilità" target="_blank"&gt;script&lt;/a&gt; per controllare in maniera automatica se i vostri file web.config sono affetti o meno da questo problema.
&lt;br /&gt;
&lt;br /&gt;Trovate maggiori informazioni riguardo questa vulnerabilità direttamente dal sito di &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx" title="Scott Guthrie" target="_blank"&gt;Scott Guthrie&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;Ecco, dobbiamo sapere che anche SharePoint Foundation 2010 e SharePoint Server 2010 sono affetti dalla medesima vulnerabilità e all'interno del &lt;a href="http://blogs.msdn.com/b/sharepoint/archive/2010/09/21/security-advisory-2416728-vulnerability-in-asp-net-and-sharepoint.aspx" title="Security Advisory 2416728 (Vulnerability in ASP.NET) and SharePoint" target="_blank"&gt;blog del team di SharePoint&lt;/a&gt; troviamo i passi per correggerla.
&lt;br /&gt;Questi i passi da seguire:
&lt;br /&gt;
&lt;br /&gt;1- Aprire la directory %CommonProgramFiles%\Microsoft Shared\Web Server Extensions\14\template\layouts. 
&lt;br /&gt;2- Creare un nuovo file, chiamato "error2.aspx" ed inserirci questo contenuto: 
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;%@&lt;/span&gt;&lt;span style='color:#FF0000'&gt; Page Language&lt;span style='color:#0000FF'&gt;="C#"&lt;/span&gt; AutoEventWireup&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt; %&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;%@&lt;/span&gt;&lt;span style='color:#FF0000'&gt; Import Namespace&lt;span style='color:#0000FF'&gt;="System.Security.Cryptography"&lt;/span&gt; %&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;%@&lt;/span&gt;&lt;span style='color:#FF0000'&gt; Import Namespace&lt;span style='color:#0000FF'&gt;="System.Threading"&lt;/span&gt; %&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;script&lt;/span&gt;&lt;span style='color:#FF0000'&gt; runat&lt;span style='color:#0000FF'&gt;="server"&lt;/span&gt;&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;   void Page_Load() {
&lt;br /&gt;      byte[] delay = new byte[1];
&lt;br /&gt;      RandomNumberGenerator prng = new RNGCryptoServiceProvider();
&lt;br /&gt;
&lt;br /&gt;      prng.GetBytes(delay);
&lt;br /&gt;      Thread.Sleep((int)delay[0]);
&lt;br /&gt;        
&lt;br /&gt;      IDisposable disposable = prng as IDisposable;
&lt;br /&gt;      if (disposable != null) { disposable.Dispose(); }
&lt;br /&gt;    }
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;script&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;html&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;head&lt;/span&gt;&lt;span style='color:#FF0000'&gt; runat&lt;span style='color:#0000FF'&gt;="server"&lt;/span&gt;&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;title&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;Error&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;title&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;head&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;body&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;div&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;        An error occurred while processing your request.
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;div&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;body&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;html&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;3- Aprire la directory %SystemDrive%\inetpub\wwwroot\wss\virtualdirectories. 
&lt;br /&gt;4- Per ognuna delle sottodirectory presenti, seguire queste istruzioni: 
&lt;br /&gt;- modificare il file web.config 
&lt;br /&gt;- recuperare la sezione customErrors e modificarla come segue:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;customErrors&lt;/span&gt;&lt;span style='color:#FF0000'&gt; mode&lt;span style='color:#0000FF'&gt;="On"&lt;/span&gt; redirectMode&lt;span style='color:#0000FF'&gt;="ResponseRewrite"&lt;/span&gt; defaultRedirect&lt;span style='color:#0000FF'&gt;="/_layouts/error2.aspx"&lt;/span&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;- salvare
&lt;br /&gt;- eseguire un IISRESET /NOFORCE 
&lt;br /&gt;
&lt;br /&gt;Nota: chiaramente se avete modificato i percorsi per le vostre web application sul file system, dovrete modificare anche i web.config inseriti al loro interno.
&lt;br /&gt;
&lt;br /&gt;Se non volete fare queste operazioni a mano, c'è chi ha creato una soluzione WSP per voi da installare in grado di correggere automaticamente la vulnerabilità. La potete trovare a questo indirizzo:
&lt;br /&gt;&lt;a href="http://shojeeb.com/sharepoint/security-advisory-2416728-vulnerability-in-asp-net-and-sharepoint/" title="Security Advisory 2416728 workaround for SharePoint" target="_blank"&gt;http://shojeeb.com/sharepoint/security-advisory-2416728-vulnerability-in-asp-net-and-sharepoint/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;Raccomando tutti di eseguire subito i controlli del caso !
&lt;br /&gt;Se volete maggiori informazioni, ecco qua un pò di link utili:
&lt;br /&gt;
&lt;br /&gt;- &lt;a href="https://www.microsoft.com/technet/security/advisory/2416728.mspx" target="_blank"&gt;Microsoft Security Advisory (2416728)&lt;/a&gt; (Vulnerability in ASP.NET Could Allow Information Disclosure)
&lt;br /&gt;- &lt;a href="http://blogs.technet.com/b/msrc/archive/2010/09/17/security-advisory-2416728-released.aspx" target="_blank"&gt;Security Advisory 2416728 Released&lt;/a&gt; (dal blog di Microsoft Security Response Center)
&lt;br /&gt;- &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx" target="_blank"&gt;Important: ASP.NET Security Vulnerability&lt;/a&gt; (dal blog di Scott Guthrie’s) 
&lt;br /&gt;- &lt;a href="http://www.aspitalia.com/focuson/1173/Vulnerabilita-0Day-ASP.NET-Rischio-Applicazioni-Configurate-Correttamente.aspx" target="_blank"&gt;Vulnerabilità 0-Day per ASP.NET: a rischio le applicazioni non configurate correttamente&lt;/a&gt; (dal blog di Daniele Bochicchio)
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint.aspx" title="TAG: SharePoint"&gt;SharePoint&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint 2010.aspx" title="TAG: SharePoint 2010"&gt;SharePoint 2010&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/SecurityAdvisory2416728VulnerabilityInASPNETAndSharePoint.aspx" /><issued>2010-9-21T15:53:8+01:00</issued><modified>2010-9-21T15:53:8+01:00</modified></entry><entry><title>Disponibile l'SDK di Silverlight 4.0 in italiano</title><id>/Blog/Silverligh4SDKInItaliano.aspx</id><created>2010-6-12T17:11:0+01:00</created><content type="text/html" mode="escaped">&lt;img src="http://www.peppedotnet.it/Images/silverlight.png" width="70px" alt="Silverlight 4.0" style="float: right; margin: 5px;" /&gt;Da ieri, è disponibile l'SDK di Silverlight 4.0 localizzato in lingua italiana.
&lt;br /&gt;Ecco il link per il download diretto:
&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=it&amp;FamilyID=55b44da3-e5de-4d2a-8eaf-1155ca6b3207" title="Microsoft Silverlight 4 SDK"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=it&amp;FamilyID=55b44da3-e5de-4d2a-8eaf-1155ca6b3207&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/Silverlight.aspx" title="TAG: Silverlight"&gt;Silverlight&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Silverlight 4.aspx" title="TAG: Silverlight 4"&gt;Silverlight 4&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/Silverligh4SDKInItaliano.aspx" /><issued>2010-6-12T17:11:0+01:00</issued><modified>2010-6-12T17:11:0+01:00</modified></entry><entry><title>SharePoint 2010 sar&#224; solo a 64 bit !</title><id>/Blog/SharePoint2010Only64Bit.aspx</id><created>2009-5-14T10:41:14+01:00</created><content type="text/html" mode="escaped">La notizia viene direttamente dal blog del team di SharePoint.
&lt;br /&gt;&lt;a href="http://blogs.msdn.com/sharepoint/archive/2009/05/07/announcing-sharepoint-server-2010-preliminary-system-requirements.aspx" title="Announcing SharePoint Server 2010 Preliminary System Requirements"&gt;http://blogs.msdn.com/sharepoint/archive/2009/05/07/announcing-sharepoint-server-2010-preliminary-system-requirements.aspx&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;SharePoint 2010 avrà solamente la versione a 64 bit e necessiterà di:&lt;ul&gt;&lt;li&gt;Windows Server 2008, sempre a 64 bit&lt;/li&gt;&lt;li&gt;SQL Server 2008 o 2005, anche questi a 64 bit&lt;/li&gt;&lt;/ul&gt;Questa cosa, è sicuramente da tenere in considerazione per tutte le nuove installazioni di SharePoint fatte da ora in poi..
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint 2010.aspx" title="TAG: SharePoint 2010"&gt;SharePoint 2010&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SharePoint.aspx" title="TAG: SharePoint"&gt;SharePoint&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/SharePoint2010Only64Bit.aspx" /><issued>2009-5-14T10:41:14+01:00</issued><modified>2009-5-14T10:41:14+01:00</modified></entry><entry><title>Microsoft Web Platform Installer</title><id>/Blog/MicrosoftWebPlatformInstaller.aspx</id><created>2008-10-7T10:26:28+01:00</created><content type="text/html" mode="escaped">Questa è proprio una bella notizia !
&lt;br /&gt;Microsoft ha rilasciato, ancora in versione beta, un tool che provvede all'installazione dell'intera piattaforma web per lo sviluppo e il rilascio in produzione delle proprie applicazioni .NET !
&lt;br /&gt;Questo il sito di riferimento:
&lt;br /&gt;&lt;a href="http://www.microsoft.com/web/channel/products/WebPlatformInstaller.aspx" title="Microsoft Web Platform Installer"&gt;http://www.microsoft.com/web/channel/products/WebPlatformInstaller.aspx&lt;/a&gt;
&lt;br /&gt;Tale installer infatti, si preoccupa di installare:&lt;ul&gt;&lt;li&gt;IIS7&lt;/li&gt;&lt;li&gt;Visual Web Developer 2008&lt;/li&gt;&lt;li&gt;SQL Server 2008 Express&lt;/li&gt;&lt;li&gt;.NET Framework 3.5&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;configurando l'ambiente in maniera automatica.
&lt;br /&gt;Inoltre, lo sviluppatore è in grado di spuntare quali di questi tool e tecnologie ha intenzione di far installare, così da personalizzare l'installazione a proprio piacimento.
&lt;br /&gt;Ancora il prodotto è in versione beta, come dicevo. Ed è disponibile per queste piattaforme:&lt;ul&gt;&lt;li&gt;Windows Vista RTM&lt;/li&gt;&lt;li&gt;Windows Vista SP1&lt;/li&gt;&lt;li&gt;Windows Server 2008&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;Per gli altri sistemi operativo, dovremmo aspettare (spero).
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/Web Platform Installer.aspx" title="TAG: Web Platform Installer"&gt;Web Platform Installer&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/IIS 7.aspx" title="TAG: IIS 7"&gt;IIS 7&lt;/a&gt;][&lt;a href="http://www.peppedotnet.it/Tags/SQL Server 2008.aspx" title="TAG: SQL Server 2008"&gt;SQL Server 2008&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/MicrosoftWebPlatformInstaller.aspx" /><issued>2008-10-7T10:26:28+01:00</issued><modified>2008-10-7T10:26:28+01:00</modified></entry><entry><title>Autenticazione con Live ID</title><id>/Blog/WindowsLiveIDAuthentication.aspx</id><created>2008-9-4T9:26:5+01:00</created><content type="text/html" mode="escaped">E' uscito ieri un mio nuovo articolo su &lt;a href="http://www.html.it" title="html.it"&gt;html.it&lt;/a&gt;. Questa volta l'argomento riguarda i servizi offerti da Windows Live ID, il meccanismo di autenticazione web proposto da Microsoft per integrare tutti i servizi della piattaforma Windows Live.
&lt;br /&gt;Attraverso la coppia "indirizzo e-mail"-"password" infatti, possiamo utilizzare sia applicazioni client come Windows Live Messenger, Live Mail e Live Writer, sia applicazioni Web come Hotmail, Live Space, SkyDrive e Photos. In questo modo solleviamo la nostra memoria dal peso di ricordare gli account per tutti questi servizi.
&lt;br /&gt;
&lt;br /&gt;Durante il corso dell'articolo si vedrà come è possibile utilizzare questo meccanismo all'interno delle proprie applicazioni web ASP.NET senza particolari sforzi, sfruttando quello che ci viene messo a disposizione da uno dei tre SDK relativi al servizio di autenticazione: il &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=24195B4E-6335-4844-A71D-7D395D20E67B&amp;displaylang=en" title="Web Authenticaion SDK"&gt;Web Authentication SDK&lt;/a&gt;.
&lt;br /&gt;
&lt;br /&gt;Vi lascio quindi il link diretto all'articolo:
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2756/autenticazione-tramite-windows-live-id/" title="Autenticazione con Live ID"&gt;http://aspnet.html.it/articoli/leggi/2756/autenticazione-tramite-windows-live-id/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Per restare in argomento, vi segnalo anche lo speciale che ASPItalia ha fatto riguardo i servizi della piattaforma di Windows Live e su come questi possono essere integrati all'interno delle nostre applicazioni web e non.
&lt;br /&gt;Qua per lo speciale: &lt;a href="http://www.aspitalia.com/focuson/1036/Speciale-Windows-Live-Services-Integrarli-Applicazioni.aspx" title="Speciale Windows Live Services: come integrarli nelle proprie applicazioni"&gt;http://www.aspitalia.com/focuson/1036/Speciale-Windows-Live-Services-Integrarli-Applicazioni.aspx&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/Windows Live.aspx" title="TAG: Windows Live"&gt;Windows Live&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Windows Live ID.aspx" title="TAG: Windows Live ID"&gt;Windows Live ID&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SOA.aspx" title="TAG: SOA"&gt;SOA&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/WindowsLiveIDAuthentication.aspx" /><issued>2008-9-4T9:26:5+01:00</issued><modified>2008-9-4T9:26:5+01:00</modified></entry><entry><title>Utilizzo dei parametri sulle query ad un database Access</title><id>/Blog/HowToUseParametersInMsAccessQuery.aspx</id><created>2008-8-30T19:15:46+01:00</created><content type="text/html" mode="escaped">In questi giorni mi sono trovato a dover effettuare una query da una pagina ASP.NET ad un database Access (cosa che ormai non facevo da tanto, visto l'amore che ho verso SQL Server). Per rispettare le varie politiche di sicurezza riguardo gli attacchi di sql injection, mi accingo ad utilizzare la classe OleDbParamter per passare i parametri necessari alla mia query.
&lt;br /&gt;Nel mio caso avevo un singolo parametro di tipo "data e ora".
&lt;br /&gt;Questo il codice che avevo scritto:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;OleDbConnection conn = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbConnection(strConn);
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;using&lt;/span&gt; (conn)
&lt;br /&gt;{
&lt;br /&gt;    OleDbCommand cmd = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbCommand();
&lt;br /&gt;    &lt;span style="color: #0000FF"&gt;using&lt;/span&gt; (cmd)
&lt;br /&gt;    {
&lt;br /&gt;        cmd.Connection = conn;
&lt;br /&gt;        cmd.CommandText = &lt;span style="color: #A31515"&gt;"SELECT * FROM table WHERE campoData &gt; @dataeora"&lt;/span&gt;;
&lt;br /&gt;        OleDbParameter param = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbParameter(&lt;span style="color: #A31515"&gt;"@dataeora"&lt;/span&gt;, DateTime.Now);
&lt;br /&gt;        cmd.Parameters.Add(param);
&lt;br /&gt;
&lt;br /&gt;        conn.Open();
&lt;br /&gt;        OleDbDataReader reader = cmd.ExecuteReader();
&lt;br /&gt;        &lt;span style="color: #0000FF"&gt;while&lt;/span&gt; (reader.Read())
&lt;br /&gt;        {
&lt;br /&gt;            &lt;span style="color: #008200"&gt;//...&lt;/span&gt;
        }
&lt;br /&gt;        reader.Close();
&lt;br /&gt;    }
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Bene... una volta eseguito questo codice, mi vedo stampare a video questa bellissima eccezione:
&lt;br /&gt;
&lt;br /&gt;&lt;div style="margin-left: 10px; color: red; font-style:italic"&gt;System.Data.OleDb.OleDbException: Data type mismatch in criteria expression&lt;/div&gt;
&lt;br /&gt;Dopo un pò di prove, mi sono accorto che Access vuole il parametro (anche se di tipo DateTime) sotto forma di stringa. Quindi mi è bastato aggiungere la chiamata al metodo ToString() e il mio errore è sparito.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;OleDbParameter param = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbParameter(&lt;span style="color: #A31515"&gt;"@dataeora"&lt;/span&gt;, DateTime.Now.ToString());&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;La cosa però non mi piaceva molto.. e googlando un pò, ho trovato una soluzione un pò più pulita. Basta infatti specificare prima della query, il numero e il tipo dei parametri che andranno utilizzati nella query stessa.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;OleDbConnection conn = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbConnection(strConn);
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;using&lt;/span&gt; (conn)
&lt;br /&gt;{
&lt;br /&gt;    OleDbCommand cmd = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbCommand();
&lt;br /&gt;    &lt;span style="color: #0000FF"&gt;using&lt;/span&gt; (cmd)
&lt;br /&gt;    {
&lt;br /&gt;        cmd.Connection = conn;
&lt;br /&gt;        cmd.CommandText = &lt;span style="color: #A31515"&gt;"PARAMETERS @dataeora datetime; "&lt;/span&gt; + 
&lt;br /&gt;                           &lt;span style="color: #A31515"&gt;"SELECT * FROM table WHERE campoData &gt; @dataeora"&lt;/span&gt;;
&lt;br /&gt;        OleDbParameter param = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbParameter(&lt;span style="color: #A31515"&gt;"@dataeora"&lt;/span&gt;, DateTime.Now);
&lt;br /&gt;        cmd.Parameters.Add(param);
&lt;br /&gt;
&lt;br /&gt;        &lt;span style="color: #008200"&gt;//...&lt;/span&gt;
    }
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Buono a sapersi per le prossime volte.. no ?
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/Access.aspx" title="TAG: Access"&gt;Access&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Parameter.aspx" title="TAG: Parameter"&gt;Parameter&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/HowToUseParametersInMsAccessQuery.aspx" /><issued>2008-8-30T19:15:46+01:00</issued><modified>2008-8-30T19:15:46+01:00</modified></entry><entry><title>Come settare il testo di una TextBox con la propriet&#224; TextMode=&quot;Password&quot;</title><id>/Blog/HowToSetTextInTextBoxModePassword.aspx</id><created>2008-8-9T11:48:6+01:00</created><content type="text/html" mode="escaped">Se provate a settare un valore alla proprietà Text di una semplice TextBox lato server, e questa ha la proprietà TextMode valorizzata su "Password", vi accorgerete che state eseguendo un'operazione che non verrà portata a termine correttamente dal runtime di ASP.NET; questo per semplici ragioni di sicurezza, in quanto tale valore (che dovrebbe essere un'informazione da proteggere) verrebbe renderizzato nel sorgente html della pagina assieme a tutto il resto dei controlli.
&lt;br /&gt;Per ovviare a questo comportamento standard di tutti i controlli di tipo TextBox, è possibile utlizzare l'attributo "value" del campo di testo:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;txt.Attributes.Add(&lt;span style="color: #A31515"&gt;"value"&lt;/span&gt;, &lt;span style="color: #A31515"&gt;"la mia password"&lt;/span&gt;);&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Così facendo, avremo il nostro valore settato correttamente all'interno della casella di testo.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/TextBox.aspx" title="TAG: TextBox"&gt;TextBox&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/HowToSetTextInTextBoxModePassword.aspx" /><issued>2008-8-9T11:48:6+01:00</issued><modified>2008-8-9T11:48:6+01:00</modified></entry><entry><title>Fare il parsing di un URL per ricavarne i parametri di querystring</title><id>/Blog/HowToParseURLforQuerystringParameters.aspx</id><created>2008-7-29T18:41:26+01:00</created><content type="text/html" mode="escaped">Oggi mi sono imbattuto in questo quesito. Come ottenere i valori dei parametri di querystirng da un'indirizzo (nel mio caso) prelevato dalla proprietà UrlReferref della richiesta corrente.
&lt;br /&gt;Per raggungere questo obbiettivo, ci viene in aiuto la classe &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httputility.aspx" title="Classe HttpUtility"&gt;HttpUtility&lt;/a&gt;, che espone il metodo &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httputility.parsequerystring.aspx" title="Metodo ParseQueryString"&gt;ParseQueryString&lt;/a&gt;. Tale metodo ritorna una collezione di tipo NameValueCollection con tutte le coppie chiave-valore rappresentati i vari parametri di querystring presenti nell'indirizzo che abbiamo dato in pasto al metodo stesso.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;NameValueCollection referrerQuerystring = HttpUtility.ParseQueryString(Request.UrlReferrer.Query);&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Chiaramente questa tecnica funziona con tutti i tipi di URL che passiamo come parametro al metodo ParseQueryString.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/HowToParseURLforQuerystringParameters.aspx" /><issued>2008-7-29T18:41:26+01:00</issued><modified>2008-7-29T18:41:26+01:00</modified></entry><entry><title>ASP.NET e Windows Live Search</title><id>/Blog/ASPNETWindowsLiveSearch.aspx</id><created>2008-7-9T19:40:40+01:00</created><content type="text/html" mode="escaped">E' uscito oggi, sempre su &lt;a href="http://www.html.it" title="html.it"&gt;html.it&lt;/a&gt;, il mio articolo sull'integrazione dei servizi offerti dal motore di Windows Live Search in applicazioni ASP.NET personalizzate.
&lt;br /&gt;L'articolo è il primo di una serie sui servizi offerti dalla piattaforma di Windows Live. Vedremo infatti, in questa e nelle prossime puntate, quali sono gli SDK, le API e i Web Services offerti dalla piattaforma Microsoft che possono andare ad arricchire i nostri siti web.
&lt;br /&gt;
&lt;br /&gt;Questo il link all'articolo, completo di codice sorgente d'esempio.
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2711/ricerche-con-aspnet-e-live-search/" title="Ricerche con ASP.NET e Live Search"&gt;http://aspnet.html.it/articoli/leggi/2711/ricerche-con-aspnet-e-live-search/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Buona lettura !
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Windows Live.aspx" title="TAG: Windows Live"&gt;Windows Live&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Live Search.aspx" title="TAG: Live Search"&gt;Live Search&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/ASPNETWindowsLiveSearch.aspx" /><issued>2008-7-9T19:40:40+01:00</issued><modified>2008-7-9T19:40:40+01:00</modified></entry><entry><title>Utilizzo dell'attributo ValidationPropertyAttribute</title><id>/Blog/HowToUseValidationPropertyAttribute.aspx</id><created>2008-5-31T11:28:33+01:00</created><content type="text/html" mode="escaped">Un pò di giorni fa mi sono imbatutto in un errore che no avevo mai visto. All'interno di una pagina asp.net avevo inserito un pò di web control di base (textbox, checkbox, ecc..) e un mio controllo custom. Volevo poi inserire dei validatori all'interno della pagina per controllare se questi controlli fossero correttamente valorizzati prima di un eventuale postback.
&lt;br /&gt;Eseguo la pagina e mi trovo questo errore:
&lt;br /&gt;
&lt;br /&gt;&lt;div style="margin-left: 10px; color: red; font-style: italic"&gt;Control '{0}' referenced by the ControlToValidate property of '{1}' cannot be validated.&lt;/div&gt;
&lt;br /&gt;In pratica cosa succedeva ? Il validatore legato al mio controllo custom (attraverso la proprietà ControlToValidate) non sapeva su che proprietà effettuare il controllo di validazione.
&lt;br /&gt;Per risolvere questo inconveniente ci viene in aiuto un attributo del .NET Framework da applicare a livello di classe, precisamente prima della dichiarazione della classe rappresentante il nostro controllo personalizzato. L'attributo in questione è il "ValidationPropertyAttribute" che segnala ad un eventuale controllo di tipo validator, su quale proprietà del mio controllo custom effettuare la validazione.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;[ValidationPropertyAttribute(&lt;span style="color: #A31515"&gt;"SelectedText"&lt;/span&gt;)]
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;class&lt;/span&gt; MyCustomControl : CompositeControl
&lt;br /&gt;{ ... }&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Nell'esempio, la validazione viene effettuata sulla proprietà "SelectedText".
&lt;br /&gt;Così facendo siamo in grado di creare dei controlli web personalizzati che possono essere vaidati dai controlli di validazione di base del .NET Framework.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/Web Controls.aspx" title="TAG: Web Controls"&gt;Web Controls&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Validator.aspx" title="TAG: Validator"&gt;Validator&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/HowToUseValidationPropertyAttribute.aspx" /><issued>2008-5-31T11:28:33+01:00</issued><modified>2008-5-31T11:28:33+01:00</modified></entry><entry><title>Web services, WCF e... ASP.NET - Parte 2</title><id>/Blog/WebServicesWCFASPNET_Parte2.aspx</id><created>2008-5-9T23:53:37+01:00</created><content type="text/html" mode="escaped">Dopo la &lt;a href="http://www.peppedotnet.it/Blog/WebServicesWCFASPNET.aspx" title="Web services, WCF e... ASP.NET"&gt;prima parte&lt;/a&gt; uscita mercoledì scorso, ecco la seconda parte del mio articolo su Windows Comunication Foundation.
&lt;br /&gt;In questa seconda parte si entra un pò più in dettaglio all'interno del codice che serve per andare a formare un semplice servizio WCF e di tutte le sezioni di configurazione, sia per quanto riguarda il servizio host che espone il servizio, sia per eventuali applicazioni client.
&lt;br /&gt;
&lt;br /&gt;Questo il link:
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2610/web-services-wcf-e-aspnet/4/" title="Web services, WCF e... ASP.NET - Parte 2"&gt;http://aspnet.html.it/articoli/leggi/2610/web-services-wcf-e-aspnet/4/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/WCF.aspx" title="TAG: WCF"&gt;WCF&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SOA.aspx" title="TAG: SOA"&gt;SOA&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/WebServicesWCFASPNET_Parte2.aspx" /><issued>2008-5-9T23:53:37+01:00</issued><modified>2008-5-9T23:53:37+01:00</modified></entry><entry><title>Web services, WCF e... ASP.NET</title><id>/Blog/WebServicesWCFASPNET.aspx</id><created>2008-5-1T11:4:6+01:00</created><content type="text/html" mode="escaped">Lo so che oggi  ci si dovrebbe riposare... ma ieri non ho fatto in tempo a segnalarlo. E' uscita infatti la prima di due parti, di un mio nuovo articolo. Questa volta si parla di Windows Comunication Foundation. L'articolo è una panoramica iniziale sull'architettura su cui si base il framework di comunicazione Microsoft, passando dai concetti di base come endpoint, address, contract e binding fino ad arrivare ad un esempio di sviluppo di un semplice servizio WCF, esposto attraverso IIS.
&lt;br /&gt;Questo il link:
&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2610/web-services-wcf-e-aspnet/" title="Web services, WCF e... ASP.NET"&gt;http://aspnet.html.it/articoli/leggi/2610/web-services-wcf-e-aspnet/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Buona lettura !
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/WCF.aspx" title="TAG: WCF"&gt;WCF&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/SOA.aspx" title="TAG: SOA"&gt;SOA&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/WebServicesWCFASPNET.aspx" /><issued>2008-5-1T11:4:6+01:00</issued><modified>2008-5-1T11:4:6+01:00</modified></entry><entry><title>Design pattern per la costruzione di un DAL - parte 2</title><id>/Blog/DesignPatternPerIlDataAccessLayer2.aspx</id><created>2008-4-17T12:6:11+01:00</created><content type="text/html" mode="escaped">Ieri è uscita la seconda parte del mio articolo su come costruire il livello di accesso ai dati per le proprie applicazioni ASP.NET basandosi sui più famosi pattern architetturali.
&lt;br /&gt;In questa seconda parte, verrà introdotto il pattern "Template Method" e verrà applicato per effettuare rapidamente il mapping delle informazioni prelevate da query di selezione dalla base di dati, sulle proprietà degli oggetti appartenenti al domain model della propria applicazione.
&lt;br /&gt;Questo il link della seconda parte:
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2588/design-pattern-per-il-data-access-layer/5/" title="Design pattern per il Data Access Layer"&gt;http://aspnet.html.it/articoli/leggi/2588/design-pattern-per-il-data-access-layer/5/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Buona lettura.
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/DAL.aspx" title="TAG: DAL"&gt;DAL&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Domain Model.aspx" title="TAG: Domain Model"&gt;Domain Model&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Design Pattern.aspx" title="TAG: Design Pattern"&gt;Design Pattern&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/DesignPatternPerIlDataAccessLayer2.aspx" /><issued>2008-4-17T12:6:11+01:00</issued><modified>2008-4-17T12:6:11+01:00</modified></entry><entry><title>Come costruire un DAL per applicazioni ASP.NET</title><id>/Blog/HowToWriteDALforASPNET.aspx</id><created>2008-4-9T18:1:11+01:00</created><content type="text/html" mode="escaped">Oggi su &lt;a href="http://www.html.it" title="html.it"&gt;html.it&lt;/a&gt;, è uscita la prima parte del mio articolo su come costruire i propri Data Access Layer (DAL) per applicazioni ASP.NET; il tutto basato sull'implementazione di due dei più noti pattern architetturali.
&lt;br /&gt;In dettaglio, per l'indipendenza dalla base di dati è stato utilizzato il pattern Abstract Factory, mentre per il mapping delle informazioni prelevate da selezioni dalla base di dati sugli oggetti del proprio Domain Model è stato utilizzato il pattern Template Method.
&lt;br /&gt;Questa seconda implementazione sarà visibile nella seconda parte dell'articolo (che sarà pubblicata mercoledì prossimo).
&lt;br /&gt;
&lt;br /&gt;Vi lascio il link:
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2588/design-pattern-per-il-data-access-layer/" title="Design pattern per il Data Access Layer"&gt;http://aspnet.html.it/articoli/leggi/2588/design-pattern-per-il-data-access-layer/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Buona lettura ;)
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/Domain Model.aspx" title="TAG: Domain Model"&gt;Domain Model&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/DAL.aspx" title="TAG: DAL"&gt;DAL&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/HowToWriteDALforASPNET.aspx" /><issued>2008-4-9T18:1:11+01:00</issued><modified>2008-4-9T18:1:11+01:00</modified></entry><entry><title>Request.ServerVariables[&quot;REMOTE_HOST&quot;]</title><id>/Blog/Request.ServerVariablesREMOTE_HOST.aspx</id><created>2007-5-20T18:32:50+01:00</created><content type="text/html" mode="escaped">L'altro giorno, un mio amico (un vero rompip... :) mi ha chiesto come prelevare il nome del pc client che accede ad un sito ASP.NET inserito all'interno di una intranet.
&lt;br /&gt;Io aveva gia affrontato questo problema, ma mi ero scordato di bloggare.
&lt;br /&gt;Per prelevare questo tipo di informazione si utilizza la collection &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.httprequest.servervariables.aspx" title="Collection ServerVariables"&gt;ServerVariables&lt;/a&gt; della classe &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.httprequest.aspx" title="HttpRequest class"&gt;HttpRequest&lt;/a&gt;, e in particolare si legge il contenuto della variabile REMOTE_HOST. Questa contiene il nome dell'host che ha effettuato la richiesta.
&lt;br /&gt;
&lt;br /&gt;Bene, al mio amico però, ritornava sempre l'indirizzo IP e non il nome della macchina. Questo perchè ? Perchè il suo sito era sotto IIS 5, che non era configurato per effettuare un revers lookup sul DNS.
&lt;br /&gt;Questa pagina di supporto Microsoft, spiega come configurare iis per effettuare questo tipo di operazione.
&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/245574/" title="How To Configure REMOTE_HOST to Perform a Reverse DNS Lookup in IIS"&gt;http://support.microsoft.com/kb/245574/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/IIS.aspx" title="TAG: IIS"&gt;IIS&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/HttpRequest.aspx" title="TAG: HttpRequest"&gt;HttpRequest&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/Request.ServerVariablesREMOTE_HOST.aspx" /><issued>2007-5-20T18:32:50+01:00</issued><modified>2007-5-20T18:32:50+01:00</modified></entry><entry><title>Gli HTTP Modules di ASP.NET</title><id>/Blog/ASPNETHttpModules.aspx</id><created>2007-4-11T15:35:25+01:00</created><content type="text/html" mode="escaped">E' stato appena pubblicato il mio secondo articolo per HTML.it, sezione ASP.NET; questa volta si parla di HTTP Modules, in quanto ho cercato di rimanere in tema con il &lt;a href="http://aspnet.html.it/articoli/leggi/2207/gli-http-handler-di-aspnet/" title="Gli HTTP Handler di ASP.NET"&gt;precedente&lt;/a&gt;.
&lt;br /&gt;Questo il link:
&lt;br /&gt;http://aspnet.html.it/articoli/leggi/2211/gli-http-modules/
&lt;br /&gt;
&lt;br /&gt;Buona lettura !
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/HTTP Modules.aspx" title="TAG: HTTP Modules"&gt;HTTP Modules&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/ASPNETHttpModules.aspx" /><issued>2007-4-11T15:35:25+01:00</issued><modified>2007-4-11T15:35:25+01:00</modified></entry><entry><title>Gli HTTP Handler di ASP.NET</title><id>/Blog/ASPNETHTTPHandler.aspx</id><created>2007-4-6T10:5:6+01:00</created><content type="text/html" mode="escaped">2 giorni fa, è stat pubblicato il mio primo articolo per HTML.IT !
&lt;br /&gt;L'argomento erano gli HTTP Handler di ASP.NET, argomento che mi è molto a cuore e conosco ormai bene. Spero sia venuto fuori un bel lavoro. Questo il link:
&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://aspnet.html.it/articoli/leggi/2207/gli-http-handler-di-aspnet/" title="Gli HTTP Handler di ASP.NET"&gt;http://aspnet.html.it/articoli/leggi/2207/gli-http-handler-di-aspnet/&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;TAGS: [&lt;a href="http://www.peppedotnet.it/Tags/HTTP Handler.aspx" title="TAG: HTTP Handler"&gt;HTTP Handler&lt;/a&gt;] [&lt;a href="http://www.peppedotnet.it/Tags/ASP.NET.aspx" title="TAG: ASP.NET"&gt;ASP.NET&lt;/a&gt;]</content><link rel="alternate" type="text/html" href="/Blog/ASPNETHTTPHandler.aspx" /><issued>2007-4-6T10:5:6+01:00</issued><modified>2007-4-6T10:5:6+01:00</modified></entry><entry><title>Chiudere una Web Form al click di un bottone</title><id>/Blog/ClosingWebForm.aspx</id><created>2005-11-7T11:27:21+01:00</created><content type="text/html" mode="escaped">Ecco un trucchetto semplice semplice per chiudere una web form tramite il click su un bottone. Questo risulta molto utile all'interno di finestre pop-up.
&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;C#&lt;/b&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;void&lt;/span&gt; btnClose_Click(&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;br /&gt;{
&lt;br /&gt;    Response.Write(&lt;span style="color: #848284"&gt;"&lt;script&gt;window.close();&lt;/script&gt;"&lt;/span&gt;);
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;VB.NET&lt;/b&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;Public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Sub&lt;/span&gt; btnClose_Click(&lt;span style="color: #0000FF"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000FF"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; EventArgs) &lt;span style="color: #0000FF"&gt;Handles&lt;/span&gt; btnClose.Click
&lt;br /&gt;   Response.Write(&lt;span style="color: #848284"&gt;"&lt;script&gt;window.close();&lt;/script&gt;"&lt;/span&gt;)
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;End&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Sub&lt;/span&gt;
&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;</content><link rel="alternate" type="text/html" href="/Blog/ClosingWebForm.aspx" /><issued>2005-11-7T11:27:21+01:00</issued><modified>2005-11-7T11:27:21+01:00</modified></entry><entry><title>Persisting  ViewState, resoconto</title><id>/Blog/ViewStateOutOfPage.aspx</id><created>2005-10-15T12:26:26+01:00</created><content type="text/html" mode="escaped">Allora, dopo i due post di &lt;a href="http://www.peppedotnet.it/Blog/Aumento_prestazioni_tramite_viewstate.aspx" title="Aumento prestazioni tramite viewstate"&gt;introduzione della problematica&lt;/a&gt; e di &lt;a href="http://www.peppedotnet.it/Blog/Persisting_viewstate.aspx" title="Persisting ViewState"&gt;descrizione di tutte le possibili implementazioni&lt;/a&gt;, ecco la conclusione sull'argomento.
&lt;br /&gt;Abbiamo detto che per inserire il contenuto del ViewState al di fuori della pagina aspx abbiamo tre possibilità:&lt;ul&gt;&lt;li&gt;utilizzare il filesystem&lt;/li&gt;&lt;li&gt;utilizzare la sessione&lt;/li&gt;&lt;li&gt;utilizzare la cache della pagina&lt;/li&gt;&lt;/ul&gt;Ecco, per comodità ho creato una mia soluzione per poter decidere su ogni pagina il tipo di tecnica da utilizzare, potendo quindi scegliere modificando una variabile aggiunta a quelle delle classe Page, classe da cui ereditano tutte le pagine ASP.NET.
&lt;br /&gt;Mi sono quindi creato un'enumeration per darmi la possibilità di effettuare la scelta:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;namespace&lt;/span&gt; Peppe.Web.UI
&lt;br /&gt;{
&lt;br /&gt;	&lt;span style="color: #0000FF"&gt;public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;enum&lt;/span&gt; ViewStateLocation
&lt;br /&gt;	{
&lt;br /&gt;		&lt;span style="color: #848284"&gt;///&lt;/span&gt;&lt;span style="color: #008200"&gt;&lt;span style="color: #848284"&gt;&lt;summary&gt;&lt;/span&gt;Leaves the viewstate ones its place.&lt;span style="color: #848284"&gt;&lt;/summary&gt;&lt;/span&gt;
&lt;/span&gt;
		Default,
&lt;br /&gt;		&lt;span style="color: #848284"&gt;///&lt;/span&gt;&lt;span style="color: #008200"&gt;&lt;span style="color: #848284"&gt;&lt;summary&gt;&lt;/span&gt;Sets view state saved on page cache.&lt;span style="color: #848284"&gt;&lt;/summary&gt;&lt;/span&gt;
&lt;/span&gt;
		Cache,
&lt;br /&gt;		&lt;span style="color: #848284"&gt;///&lt;/span&gt;&lt;span style="color: #008200"&gt;&lt;span style="color: #848284"&gt;&lt;summary&gt;&lt;/span&gt;Sets view state saved on session.&lt;span style="color: #848284"&gt;&lt;/summary&gt;&lt;/span&gt;
&lt;/span&gt;
		Session,
&lt;br /&gt;		&lt;span style="color: #848284"&gt;///&lt;/span&gt;&lt;span style="color: #008200"&gt;&lt;span style="color: #848284"&gt;&lt;summary&gt;&lt;/span&gt;Sets view state saved on filesystem.&lt;span style="color: #848284"&gt;&lt;/summary&gt;&lt;/span&gt;
&lt;/span&gt;
		FileSystem
&lt;br /&gt;	}
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;e sono andato a creare una nuova classe che erediti dalla classe Page.
&lt;br /&gt;A questa classe ho aggiunto la proprietà ViewStateLocation, per settare il tipo di tecnica da utilizzare per salvare il viewstate, e le proprietà ViewStateDirectory e ViewStateFilePath, utili per l'archiviazione del viewstate sul filesystem. Infine ho fatto l'overload dei metodi LoadPageStateFromPersistenceMedium e SavePageStateToPersistenceMedium e ci ho inserito dentro il codice necessario ad implementare tutte le tecniche descritte.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;protected&lt;/span&gt; &lt;span style="color: #0000FF"&gt;override&lt;/span&gt; &lt;span style="color: #0000FF"&gt;object&lt;/span&gt; LoadPageStateFromPersistenceMedium()
&lt;br /&gt;{
&lt;br /&gt;	&lt;span style="color: #0000FF"&gt;switch&lt;/span&gt;(&lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.ViewStateLocation)
&lt;br /&gt;	{
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;case&lt;/span&gt; ViewStateLocation.Cache:
&lt;br /&gt;		{
&lt;br /&gt;			LosFormatter formatter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; LosFormatter();
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;string&lt;/span&gt; str = Request.Form[&lt;span style="color: #848284"&gt;"__VIEWSTATE_KEY"&lt;/span&gt;];
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;if&lt;/span&gt; (!str.StartsWith(&lt;span style="color: #848284"&gt;"VIEWSTATE_"&lt;/span&gt;)) 
&lt;br /&gt;			{
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;throw&lt;/span&gt; &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; Exception(&lt;span style="color: #848284"&gt;"Invalid viewstate key:"&lt;/span&gt; + str);
&lt;br /&gt;			}
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; vs = Cache[str];
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;if&lt;/span&gt;(vs != &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;)
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;return&lt;/span&gt; formatter.Deserialize(vs.ToString());
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;else&lt;/span&gt;
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;return&lt;/span&gt; &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;;
&lt;br /&gt;		}
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;case&lt;/span&gt; ViewStateLocation.Session:
&lt;br /&gt;		{
&lt;br /&gt;			LosFormatter formatter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; LosFormatter();
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; vs = Session[&lt;span style="color: #848284"&gt;"state"&lt;/span&gt;];
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;if&lt;/span&gt; (vs!=&lt;span style="color: #0000FF"&gt;null&lt;/span&gt;)
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;return&lt;/span&gt; formatter.Deserialize(vs.ToString());
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;else&lt;/span&gt;
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;return&lt;/span&gt; &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;;
&lt;br /&gt;		}
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;case&lt;/span&gt; ViewStateLocation.FileSystem:
&lt;br /&gt;		{
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;string&lt;/span&gt; vsString = Request.Form[ViewStateHiddenFieldName];
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;if&lt;/span&gt; (!File.Exists(vsString))
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;throw&lt;/span&gt; &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; Exception(&lt;span style="color: #848284"&gt;"The Viewstate file "&lt;/span&gt; + vsString + &lt;span style="color: #848284"&gt;" is missing."&lt;/span&gt;);
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;else&lt;/span&gt;
&lt;br /&gt;			{
&lt;br /&gt;				LosFormatter formatter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; LosFormatter();
&lt;br /&gt;				StreamReader sr = File.OpenText(vsString);
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;string&lt;/span&gt; viewStateString = sr.ReadToEnd();
&lt;br /&gt;				sr.Close();
&lt;br /&gt;				&lt;span style="color: #0000FF"&gt;return&lt;/span&gt; formatter.Deserialize(viewStateString);
&lt;br /&gt;			}
&lt;br /&gt;		}
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;default&lt;/span&gt;:
&lt;br /&gt;		{
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;return&lt;/span&gt; &lt;span style="color: #0000FF"&gt;base&lt;/span&gt;.LoadPageStateFromPersistenceMedium();
&lt;br /&gt;		}
&lt;br /&gt;	}
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;protected&lt;/span&gt; &lt;span style="color: #0000FF"&gt;override&lt;/span&gt; &lt;span style="color: #0000FF"&gt;void&lt;/span&gt; SavePageStateToPersistenceMedium(&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; viewState)
&lt;br /&gt;{
&lt;br /&gt;	&lt;span style="color: #0000FF"&gt;switch&lt;/span&gt;(&lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.ViewStateLocation)
&lt;br /&gt;	{
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;case&lt;/span&gt; ViewStateLocation.Cache:
&lt;br /&gt;		{
&lt;br /&gt;			LosFormatter formatter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; LosFormatter();
&lt;br /&gt;			StringWriter writer = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; StringWriter();
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;string&lt;/span&gt; str = &lt;span style="color: #848284"&gt;"VIEWSTATE_"&lt;/span&gt; + Request.UserHostAddress + &lt;span style="color: #848284"&gt;"_"&lt;/span&gt;
&lt;br /&gt;						+ DateTime.Now.Ticks.ToString();
&lt;br /&gt;			formatter.Serialize(writer, viewState);
&lt;br /&gt;			Cache.Add(str, writer.ToString(), &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;,
&lt;br /&gt;			DateTime.Now.AddMinutes(Session.Timeout),TimeSpan.Zero,
&lt;br /&gt;			CacheItemPriority.Default, &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;);
&lt;br /&gt;			writer.Close();
&lt;br /&gt;			RegisterHiddenField(&lt;span style="color: #848284"&gt;"__VIEWSTATE_KEY"&lt;/span&gt;, str);
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;break&lt;/span&gt;;
&lt;br /&gt;		}
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;case&lt;/span&gt; ViewStateLocation.Session:
&lt;br /&gt;		{
&lt;br /&gt;			StringWriter writer = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; StringWriter();
&lt;br /&gt;			LosFormatter formatter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; LosFormatter();
&lt;br /&gt;			formatter.Serialize(writer, viewState);
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;string&lt;/span&gt; state = writer.ToString();
&lt;br /&gt;			writer.Close();
&lt;br /&gt;			Session[&lt;span style="color: #848284"&gt;"state"&lt;/span&gt;] = state;
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;break&lt;/span&gt;;
&lt;br /&gt;		}
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;case&lt;/span&gt; ViewStateLocation.FileSystem:
&lt;br /&gt;		{
&lt;br /&gt;			LosFormatter formatter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; LosFormatter();
&lt;br /&gt;			StringWriter writer = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; StringWriter();
&lt;br /&gt;			formatter.Serialize(writer, viewState);
&lt;br /&gt;			StreamWriter sw = File.CreateText(&lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.ViewStateFilePath);
&lt;br /&gt;			sw.Write(writer.ToString());
&lt;br /&gt;			sw.Close();
&lt;br /&gt;			writer.Close();
&lt;br /&gt;			Page.RegisterHiddenField(ViewStateHiddenFieldName, ViewStateFilePath);
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;break&lt;/span&gt;;
&lt;br /&gt;		}
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;default&lt;/span&gt;:
&lt;br /&gt;		{
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;base&lt;/span&gt;.SavePageStateToPersistenceMedium(viewState);
&lt;br /&gt;			&lt;span style="color: #0000FF"&gt;break&lt;/span&gt;;
&lt;br /&gt;		}
&lt;br /&gt;	}
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Fatto questo, non resta altro che ereditare le nostre classi di code-behind delle nostre pagine .aspx, dalla classe che abbiamo appena definito e non dalla classe Page, e assegnare un valore alla variabile ViewStateLocation.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;class&lt;/span&gt; myASPXpage : Peppe.Web.UI.Page
&lt;br /&gt;{
&lt;br /&gt;	&lt;span style="color: #0000FF"&gt;public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; sender, System.EventArgs e)
&lt;br /&gt;	{
&lt;br /&gt;		&lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.ViewStateLocation = Peppe.Web.UI.ViewStateLocation.Session;
&lt;br /&gt;	}
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;E con questo post chiudo l'argomento :)</content><link rel="alternate" type="text/html" href="/Blog/ViewStateOutOfPage.aspx" /><issued>2005-10-15T12:26:26+01:00</issued><modified>2005-10-15T12:26:26+01:00</modified></entry><entry><title>Persisting viewstate</title><id>/Blog/Persisting_viewstate.aspx</id><created>2005-8-25T14:58:48+01:00</created><content type="text/html" mode="escaped">Nel precedente post riguardante il viewstate, &lt;a href="http://www.peppedotnet.it/Blog/Aumento_prestazioni_tramite_viewstate.aspx#comm" title="Commento di Lorenzo"&gt;mi è stato chiesto da Lorenzo&lt;/a&gt; se fosse conveniente salvare il viewstate sul filesystem come proposto da &lt;a href="http://scottonwriting.net/sowblog/" title="Scott Mitchell"&gt;Scott Mitchell&lt;/a&gt;.
&lt;br /&gt;Come prima risposta mi è venuto in mente che forse era una tecnica un pò dispendiosa, pensando ad un operazione di I/O ad ogni accesso alla pagina.
&lt;br /&gt;Poi, spinto dalla curiosità, mi sono documentato un pochino di più. E mi sono letto questi articoli sull'argomento:
&lt;br /&gt;
&lt;br /&gt;- &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/viewstate.asp" title="Understanding ASP.NET View State"&gt;Understanding ASP.NET View State&lt;/a&gt; di Scott Micthell
&lt;br /&gt;- &lt;a href="http://msdn.microsoft.com/msdnmag/issues/03/02/CuttingEdge/" title="The ASP.NET View State"&gt;The ASP.NET View State&lt;/a&gt; di Dino Esposito
&lt;br /&gt;- &lt;a href="http://aspalliance.com/472" title="Persisting View State to the File System"&gt;Persisting View State to the File System&lt;/a&gt; di Justin Lovell
&lt;br /&gt;
&lt;br /&gt;La tecnica descritta è sempre la stessa. Cioè quella di crearsi una propria classe che erediti dalla classe Page e riscrivere i metodi &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIPageClassLoadPageStateFromPersistenceMediumTopic.asp" title="LoadPageStateFromPersistenceMedium()"&gt;LoadPageStateFromPersistenceMedium()&lt;/a&gt; e &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebUIPageClassSavePageStateToPersistenceMediumTopic.asp" title="SavePageStateToPersistenceMedium(object viewState)"&gt;SavePageStateToPersistenceMedium(object viewState)&lt;/a&gt; inserendo il codice per serializzare il viewstate e creare un nuovo file sul server, tramite le classi del namespace System.IO (il nome del file risultante, conterrà il session ID della richiesta).
&lt;br /&gt;Una volta creata la classe, tutte le pagine dell'applicazione dovranno ereditare da questa ...
&lt;br /&gt;
&lt;br /&gt;&lt;% @Page Language="C#" Inherits="Peppe.MyNewPage" %&gt;
&lt;br /&gt;
&lt;br /&gt;Ora che è tutto più chiaro, devo dire che la tecnica mi piace molto.
&lt;br /&gt;Inoltre ho trovato anche chi dice di &lt;a href="http://dotnet.org.za/armand/archive/2004/11/11/6348.aspx" title="salvare il viewstate all'intero della sessione"&gt;salvare il viewstate all'intero della sessione&lt;/a&gt;, o &lt;a href="http://www.eggheadcafe.com/articles/20040613.asp" title="Salvare il viewstate all'interno della cache"&gt;all'interno della cache&lt;/a&gt;.
&lt;br /&gt;Avevo pensato di fare delle prove, ma &lt;a href="http://www.eggheadcafe.com/articles/20040613.asp" title="Prove viewstate"&gt;c'è chi le ha gia fatte per me&lt;/a&gt;.
&lt;br /&gt;E indovinate chi ha vinto ?
&lt;br /&gt;La signora &lt;b&gt;cache&lt;/b&gt;, con 169 richieste al secondo.</content><link rel="alternate" type="text/html" href="/Blog/Persisting_viewstate.aspx" /><issued>2005-8-25T14:58:48+01:00</issued><modified>2005-8-25T14:58:48+01:00</modified></entry><entry><title>Aumentare le prestazioni di un sito web utilizzando al meglio il ViewState</title><id>/Blog/Aumento_prestazioni_tramite_viewstate.aspx</id><created>2005-7-23T19:32:34+01:00</created><content type="text/html" mode="escaped">Il ViewState è un oggetto molto importante per chi sviluppa applicazioni web ASP.NET; esso infatti tiene traccia, con una stringa codificata di caratteri, dello stato della pagina dopo la sua ultima elaborazione lato server (per esempio dopo un postback), in modo tale da permettere allo sviluppatore di utilizzare delle proprietà dei web controls presenti nella pagina, prima che la pagina stessa sia inviata nuovamente al server.
&lt;br /&gt;La stringa di caratteri codificata, viene inserita in ogni pagina, all'interno di un campo hidden (nascosto), pronta ad essere decodificata e rielaborata una volta effettuato un postback.
&lt;br /&gt;Il campo hidden è stato chiamato __VIEWSTATE, e ha questa forma:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;input&lt;/span&gt;&lt;span style='color:#FF0000'&gt; type&lt;span style='color:#0000FF'&gt;="hidden"&lt;/span&gt; name&lt;span style='color:#0000FF'&gt;="__VIEWSTATE"&lt;/span&gt; value&lt;span style='color:#0000FF'&gt;="dDw4OTE1NzQzMjt0PDtsPGk8M ..."&lt;/span&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Capirete che in pagine con parecchi web controls, la stringa rappresentante il viewstate inizierà ad avere una certa lunghezza, andando cosi' ad influire pesantemente nelle prestazioni della pagina.
&lt;br /&gt;E' buon uso quindi cercare di utilizzare il ViewState solamente nella pagine web in cui ne abbiamo effettivamente il bisogno.
&lt;br /&gt;Il ViewSate, di default, è abilitato in ogni pagina, ma è possibile disabilitarlo o includendo l'attributo EnableViewState="false" nella direttiva @Page della pagina scelta
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="background-color: yellow"&gt;&lt;%@ Page language="c#" Codebehind="prova.aspx.cs"&lt;br /&gt;AutoEventWireup="false" Inherits="Peppe.prova" EnableViewState="false" %&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;oppure è possibile decidere di togliere il viewstate da tutte le pagine della propria applicazione web, inserendo nel web.config
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;pages&lt;/span&gt;&lt;span style='color:#FF0000'&gt; buffer&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt;
&lt;br /&gt;       enableSessionState&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt;
&lt;br /&gt;       enableViewState&lt;span style='color:#0000FF'&gt;="false"&lt;/span&gt; 
&lt;br /&gt;       enableViewStatMac&lt;span style='color:#0000FF'&gt;="false"&lt;/span&gt; 
&lt;br /&gt;&lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Inoltre, se per esempio avete una pagina dove utilizzate in concreto il ViewState, e dove sono presenti altri web controls che invece non ne hanno bisogno, basterà disabilitare l'uso del ViewState solamente per quei singoli controlli, dando il valore True alla proprietà EnableViewState.
&lt;br /&gt;
&lt;br /&gt;Una volta presi tutti questi accorgimenti, controllate pure il peso della pagina con il viewstate e senza, per verificarne il reale abbassamento, ed un successivo aumento delle prestazioni.</content><link rel="alternate" type="text/html" href="/Blog/Aumento_prestazioni_tramite_viewstate.aspx" /><issued>2005-7-23T19:32:34+01:00</issued><modified>2005-7-23T19:32:34+01:00</modified></entry><entry><title>RepeaterPlus, updates</title><id>/Blog/RepeaterPlus_updates.aspx</id><created>2005-7-10T13:6:34+01:00</created><content type="text/html" mode="escaped">Oggi ho inserito gli aggiornamenti fatti al mio &lt;a href="http://www.peppedotnet.it/RepeaterPlus" title="RepeaterPlus"&gt;RepeaterPlus&lt;/a&gt;.
&lt;br /&gt;Ho aggiunto una nuova enum che permette di scegliere tra tre modi di visualizzazione del paginatore:&lt;ul&gt;&lt;li&gt;Solo i link "next/prev"&lt;/li&gt;&lt;li&gt;Solo i link ai numeri di pagina&lt;/li&gt;&lt;li&gt;Sia i link "next/prev" che ai numeri di pagina&lt;/li&gt;&lt;/ul&gt;L'opzione di defualt è la prima, quindi solo i link "next/prev", mentre per specificarne delle altre, bisogna settare il valore della proprietà PagerMode del RepeaterPlus.
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;cc1:RepeaterPlus&lt;/span&gt;&lt;span style='color:#FF0000'&gt; id&lt;span style='color:#0000FF'&gt;="rep"&lt;/span&gt; runat&lt;span style='color:#0000FF'&gt;="server"&lt;/span&gt;
&lt;br /&gt;                           AllowPaging&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt;
&lt;br /&gt;                           RecordPerPage&lt;span style='color:#0000FF'&gt;="2"&lt;/span&gt;
&lt;br /&gt;                           PagingParameterName&lt;span style='color:#0000FF'&gt;="page"&lt;/span&gt;
&lt;br /&gt;                           PaginationPosition&lt;span style='color:#0000FF'&gt;="Bottom"&lt;/span&gt;
&lt;br /&gt;                           PagerMode&lt;span style='color:#0000FF'&gt;="NextPrevNumbers"&lt;/span&gt;&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;ItemTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;        &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;%#&lt;/span&gt;&lt;span style='color:#FF0000'&gt; Container.DataItem %&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt; &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;br&lt;/span&gt;&lt;span style='color:#FF0000'&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;ItemTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;EmptyTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;Non ci sono record&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;EmptyTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;cc1:RepeaterPlus&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;Mi sono anche accorto che manca la gestione di eventuali altri parametri passati come querystring. Sto pensando il modo più veloce e ottimale per risolvere la cosa. Perchè chiaramente, se ho una pagina del tipo search.aspx?key=peppe, il valore della variabile "key" mi deve essere mantenuto tra la pagine della paginazione, e quindi i link del paginatore dovrebbero essere tutti del tipo: search.aspx?key=peppe&amp;page=1.
&lt;br /&gt;Sarà la prossima mancanza cui cercherò di rimediare.</content><link rel="alternate" type="text/html" href="/Blog/RepeaterPlus_updates.aspx" /><issued>2005-7-10T13:6:34+01:00</issued><modified>2005-7-10T13:6:34+01:00</modified></entry><entry><title>Caching di dati. Alziamo le performance del nostro sito</title><id>/Blog/Caching_di_dati.aspx</id><created>2005-7-3T17:9:39+01:00</created><content type="text/html" mode="escaped">In un sito con pagine che effettuano varie operazioni ogni volta che vengono caricate, soprattutto operazioni di accesso ai dati su di un database, è molto utile applicare un certo tipo di politiche di caching dei dati, in modo tale da aumentare le prestazioni di ogni pagina del sito.
&lt;br /&gt;Il .NET Framework ci permette di accedere alla cache di ogni pagina tramite l'oggetto Cache del namespace System.Web.Caching; questo oggetto può essere sfruttato come contenitore dei dati che vengono richiesti dalla pagina per un certo periodo di tempo.
&lt;br /&gt;Vediamo un esempio di utilizzo della cache di una pagina per salvare i risultati di una query ed evitare (per un periodo di tempo ben preciso) che la base di dati sia accessa ad ogni richiesta della pagina.
&lt;br /&gt;
&lt;br /&gt;&lt;b&gt;C#&lt;/b&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;protected&lt;/span&gt; System.Web.UI.WebControls.Repeater rep;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;private&lt;/span&gt; OleDbConnection conn = &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;private&lt;/span&gt; OleDbCommand cmd = &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;br /&gt;{
&lt;br /&gt;     DataTable dt = (DataTable)&lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.Cache.Get(&lt;span style="color: #848284"&gt;"LinksDataTable"&lt;/span&gt;);
&lt;br /&gt;     &lt;span style="color: #0000FF"&gt;if&lt;/span&gt;(dt == &lt;span style="color: #0000FF"&gt;null&lt;/span&gt;)
&lt;br /&gt;     {
&lt;br /&gt;          &lt;span style="color: #008200"&gt;//Se quell'oggetto non è presente in cache
&lt;/span&gt;
          &lt;span style="color: #008200"&gt;//faccio la richiesta al database
&lt;/span&gt;
          &lt;span style="color: #0000FF"&gt;using&lt;/span&gt;(conn = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbConnection(&lt;span style="color: #848284"&gt;"stringa di connessione ..."&lt;/span&gt;);
&lt;br /&gt;          {
&lt;br /&gt;               &lt;span style="color: #0000FF"&gt;using&lt;/span&gt;(cmd = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbCommand(&lt;span style="color: #848284"&gt;"SELECT * FROM Links"&lt;/span&gt;, conn);
&lt;br /&gt;               {
&lt;br /&gt;                    OleDbDataAdapter adapter = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; OleDbDataAdapter(cmd);
&lt;br /&gt;                    DataSet ds = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; DataSet();
&lt;br /&gt;                    adapter.Fill(ds, &lt;span style="color: #848284"&gt;"Links"&lt;/span&gt;);
&lt;br /&gt;                    dt = ds.Tables[&lt;span style="color: #848284"&gt;"Links"&lt;/span&gt;];
&lt;br /&gt;                    &lt;span style="color: #008200"&gt;//Aggiungo la DataTable creata alla cache della pagina
&lt;/span&gt;
                    &lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.Cache.Insert(&lt;span style="color: #848284"&gt;"LinksDataTable"&lt;/span&gt;, dt);
&lt;br /&gt;
&lt;br /&gt;                    &lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.rep.DataSource = dt;
&lt;br /&gt;                    &lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.rep.DataBind();
&lt;br /&gt;               }
&lt;br /&gt;          }
&lt;br /&gt;     }
&lt;br /&gt;     &lt;span style="color: #0000FF"&gt;else&lt;/span&gt;
&lt;br /&gt;     {
&lt;br /&gt;          &lt;span style="color: #008200"&gt;//Se quell'oggetto è presente il cache
&lt;/span&gt;
          &lt;span style="color: #008200"&gt;//stampo i dati
&lt;/span&gt;
          &lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.rep.DataSource = dt;
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;this&lt;/span&gt;.rep.DataBind();
&lt;br /&gt;     }
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;&lt;b&gt;VB.NET&lt;/b&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000FF"&gt;WithEvents&lt;/span&gt; rep &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; System.Web.UI.WebControls.Repeater
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;Private&lt;/span&gt; conn &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; OleDbConnection
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;Private&lt;/span&gt; cmd &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; OleDbCommand
&lt;br /&gt;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;Public&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Sub&lt;/span&gt; Page_Load(&lt;span style="color: #0000FF"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000FF"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; EventArgs) &lt;span style="color: #0000FF"&gt;Handles&lt;/span&gt; &lt;span style="color: #0000FF"&gt;MyBase&lt;/span&gt;.Load
&lt;br /&gt;
&lt;br /&gt;     &lt;span style="color: #0000FF"&gt;Dim&lt;/span&gt; dt &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; DataTable = &lt;span style="color: #0000FF"&gt;CType&lt;/span&gt;(this.Cache.&lt;span style="color: #0000FF"&gt;Get&lt;/span&gt;(&lt;span style="color: #848284"&gt;"LinksDataTable"&lt;/span&gt;), DataTable);
&lt;br /&gt;     &lt;span style="color: #0000FF"&gt;If&lt;/span&gt; dt &lt;span style="color: #0000FF"&gt;Is&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Nothing&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;          &lt;span style="color: #008200"&gt;'Se quell'oggetto non è presente in cache
&lt;/span&gt;
          &lt;span style="color: #008200"&gt;'faccio la richiesta al database
&lt;/span&gt;
          &lt;span style="color: #0000FF"&gt;Dim&lt;/span&gt; conn &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; &lt;span style="color: #0000FF"&gt;New&lt;/span&gt; OleDbConnection(&lt;span style="color: #848284"&gt;"stringa di connessione ..."&lt;/span&gt;)
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;Dim&lt;/span&gt; cmd &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; &lt;span style="color: #0000FF"&gt;New&lt;/span&gt; OleDbCommand(&lt;span style="color: #848284"&gt;"SELECT * FROM Links"&lt;/span&gt;, conn)
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;Dim&lt;/span&gt; adapter &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; &lt;span style="color: #0000FF"&gt;New&lt;/span&gt; OleDbDataAdapter(cmd)
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;Dim&lt;/span&gt; ds &lt;span style="color: #0000FF"&gt;As&lt;/span&gt; &lt;span style="color: #0000FF"&gt;New&lt;/span&gt; DataSet()
&lt;br /&gt;          adapter.Fill(ds, &lt;span style="color: #848284"&gt;"Links"&lt;/span&gt;)
&lt;br /&gt;          dt = ds.Tables(&lt;span style="color: #848284"&gt;"Links"&lt;/span&gt;)
&lt;br /&gt;          &lt;span style="color: #008200"&gt;'Aggiungo la DataTable creata alla cache della pagina
&lt;/span&gt;
          &lt;span style="color: #0000FF"&gt;Me&lt;/span&gt;.Cache.Insert(&lt;span style="color: #848284"&gt;"LinksDataTable"&lt;/span&gt;, dt);
&lt;br /&gt;
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;Me&lt;/span&gt;.rep.DataSource = dt;
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;Me&lt;/span&gt;.rep.DataBind();
&lt;br /&gt;
&lt;br /&gt;     &lt;span style="color: #0000FF"&gt;Else&lt;/span&gt;
&lt;br /&gt;          &lt;span style="color: #008200"&gt;'Se quell'oggetto è presente il cache stampo i dati
&lt;/span&gt;
          &lt;span style="color: #0000FF"&gt;Me&lt;/span&gt;.rep.DataSource = dt
&lt;br /&gt;          &lt;span style="color: #0000FF"&gt;Me&lt;/span&gt;.rep.DataBind()
&lt;br /&gt;     &lt;span style="color: #0000FF"&gt;End&lt;/span&gt; &lt;span style="color: #0000FF"&gt;If&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;End&lt;/span&gt; &lt;span style="color: #0000FF"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;La durata della cache di ogni pagina può essere definita in due modi, o tramite la direttiva @OutputCache da inserire subito dopo la direttiva @Page della pagina in questione
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="background-color: yellow"&gt;&lt;%@ OutputCache Duration="60" VaryByParam="*" %&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;oppure tramite l'aggiunta di una nuova sezione nel file web.config dell'applicazione web
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;configuration&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;     &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;configSections&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;          &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;section&lt;/span&gt;&lt;span style='color:#FF0000'&gt; name&lt;span style='color:#0000FF'&gt;="CacheSettings"&lt;/span&gt; 
&lt;br /&gt;                   type&lt;span style='color:#0000FF'&gt;="System.Configuration.NameValueFileSectionHandler, System, 
&lt;br /&gt;                   Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"&lt;/span&gt; 
&lt;br /&gt;          &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;     &lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;configSections&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;     &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;CacheSettings&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;          &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;add&lt;/span&gt;&lt;span style='color:#FF0000'&gt; key&lt;span style='color:#0000FF'&gt;="EnableCaching"&lt;/span&gt; value&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;          &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;add&lt;/span&gt;&lt;span style='color:#FF0000'&gt; key&lt;span style='color:#0000FF'&gt;="RequireKeyDefinitionInConfig"&lt;/span&gt; value&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;          &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;add&lt;/span&gt;&lt;span style='color:#FF0000'&gt; key&lt;span style='color:#0000FF'&gt;="DefaultCacheDurationUnits"&lt;/span&gt; value&lt;span style='color:#0000FF'&gt;="seconds"&lt;/span&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;          &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;add&lt;/span&gt;&lt;span style='color:#FF0000'&gt; key&lt;span style='color:#0000FF'&gt;="DefaultCacheDurationValue"&lt;/span&gt; value&lt;span style='color:#0000FF'&gt;="60"&lt;/span&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;     &lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;CacheSettings&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;configuration&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;che ci permette di specificare parametri per la cache di tutte le pagine del sito, oppure anche per ogni singolo oggetto che pensiamo di inserirci.
&lt;br /&gt;Io ho utilizzato questa tecnica in molte delle pagine e dei server control presenti in questo sito e devo dire che le prestazioni delle richieste di ogni pagina sono davvero migliorate.</content><link rel="alternate" type="text/html" href="/Blog/Caching_di_dati.aspx" /><issued>2005-7-3T17:9:39+01:00</issued><modified>2005-7-3T17:9:39+01:00</modified></entry><entry><title>RepeaterPlus v0.7</title><id>/Blog/RepeaterPlus_v07.aspx</id><created>2005-6-24T15:59:54+01:00</created><content type="text/html" mode="escaped">Oggi, giusto per riprendermi dal mancamento di ieri (qui a Milano ci si scioglie), ho messo on-line un server control che ho implementato per facilitarmi un pochino la vita. L'ho chiamato "RepeaterPlus", proprio perchè estende le funzionalità base del web control Repeater di ASP.NET, aggiungendoci la paginazione. Lo potete trovare sotto la sezione &lt;a href="http://www.peppedotnet.it/projects.aspx" title="Sezione Projects"&gt;"Projects"&lt;/a&gt;, ma vi lascio cmq il link
&lt;br /&gt;
&lt;br /&gt;&lt;a href="http://www.peppedotnet.it/RepeaterPlus/" title="RepeaterPlus"&gt;http://www.peppedotnet.it/RepeaterPlus&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;Ho scelto questo tipo di approccio, perchè credo nelle potenzialità del repeater (al posto dei vari DataGrid e DataList), suprattutto per quanto riguarda l'output, che è totalmente personalizzabile da parte dello sviluppatore.
&lt;br /&gt;Per adesso il control non fa nient'altro che paginare i record inseriti come data source secondo un numero, scelto dall'utente, di record per pagina. Inoltre è possibile personalizzare il parametro di querystring utile ad indentificare il numero di pagina corrente e decidere se mettere la paginazione prima o dopo la visualizzazione dei record.
&lt;br /&gt;Ho messo anche vari esempi di codice sia in VB.NET che in C#, ed eccone qui uno:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style='background-color: yellow'&gt;&lt;%@ Register TagPrefix="cc1" Namespace="Peppe.UI.WebControls" Assembly="Peppe.UI.WebControls" %&gt;&lt;/span&gt;
&lt;br /&gt;...
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;cc1:RepeaterPlus&lt;/span&gt;&lt;span style='color:#FF0000'&gt; id&lt;span style='color:#0000FF'&gt;="rep"&lt;/span&gt; runat&lt;span style='color:#0000FF'&gt;="server"&lt;/span&gt;
&lt;br /&gt;                             AllowPaging&lt;span style='color:#0000FF'&gt;="true"&lt;/span&gt;
&lt;br /&gt;                             RecordPerPage&lt;span style='color:#0000FF'&gt;="2"&lt;/span&gt;
&lt;br /&gt;                             PagingParameterName&lt;span style='color:#0000FF'&gt;="page"&lt;/span&gt;
&lt;br /&gt;                             PaginationPosition&lt;span style='color:#0000FF'&gt;="Bottom"&lt;/span&gt;&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;ItemTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;        &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;%#&lt;/span&gt;&lt;span style='color:#FF0000'&gt; Container.DataItem %&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt; &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;br&lt;/span&gt;&lt;span style='color:#FF0000'&gt; &lt;/span&gt;&lt;span style='color:#0000FF'&gt;/&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;ItemTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span style='color:#0000FF'&gt;&lt;&lt;/span&gt;&lt;span style='color:#800000'&gt;EmptyTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;Non ci sono record&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;EmptyTemplate&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;
&lt;br /&gt;&lt;span style='color:#0000FF'&gt;&lt;/&lt;/span&gt;&lt;span style='color:#800000'&gt;cc1:RepeaterPlus&lt;/span&gt;&lt;span style='color:#0000FF'&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;e nel code-behind:
&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;&lt;pre&gt;&lt;span style="color: #0000FF"&gt;protected&lt;/span&gt; Peppe.UI.WebControls.RepeaterPlus rep;
&lt;br /&gt;
&lt;br /&gt;&lt;span style="color: #0000FF"&gt;private&lt;/span&gt; &lt;span style="color: #0000FF"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000FF"&gt;object&lt;/span&gt; sender, System.EventArgs e)
&lt;br /&gt;{
&lt;br /&gt;    ArrayList lista = &lt;span style="color: #0000FF"&gt;new&lt;/span&gt; ArrayList();
&lt;br /&gt;    lista.Add(&lt;span style="color: #848284"&gt;"uno"&lt;/span&gt;);
&lt;br /&gt;    lista.Add(&lt;span style="color: #848284"&gt;"due"&lt;/span&gt;);
&lt;br /&gt;    lista.Add(&lt;span style="color: #848284"&gt;"tre"&lt;/span&gt;);
&lt;br /&gt;
&lt;br /&gt;    rep.DataSource = lista;
&lt;br /&gt;    rep.DataBind();
&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;br /&gt;RepeaterPlus supporta qualsiasi tipo di data source che implementi l'interfaccia IEnumerable, ed è stato testato con successo con DataTable, DataView, DataSet ed ArrayList (i test sono disponibili nel &lt;a href="http://www.peppedotnet.it/RepeaterPlus/RepeaterPlus_Esempi.zip" title="RepeaterPlus - esempi"&gt;file degli esempi&lt;/a&gt;).
&lt;br /&gt;Ho inoltre aggiungo un nuovo "template" (chiamato EmptyTemplate) utile a documentare il fatto che il data source legato al repeater, non ha record, o che non è stato asssociato alcun datasource al control. Questa tecnica l'ho appresa da &lt;a href="http://www.aspitalia.com/liste/usag/script.aspx?ID=681" title="Articolo di Daniele Bochicchio"&gt;questo articolo&lt;/a&gt; di Daniele Bochicchio di &lt;a href="http://www.aspitalia.com" title="ASPItalia.com"&gt;ASPItalia.com&lt;/a&gt;.
&lt;br /&gt;Le prossime features che vorrei aggiungere sono:&lt;ul&gt;&lt;li&gt;inserire il supporto per l'intellisense e il design di Visual Studio.NET&lt;/li&gt;&lt;li&gt;modificare la paginazione di molti record, e metterla di 10 in 10&lt;/li&gt;&lt;li&gt;aggiungere più tipi di paginazione (Es: solo numeri, next/prev, numeri e next/prev)&lt;/li&gt;&lt;li&gt;aggiungere funzionalità di sorting&lt;/li&gt;&lt;/ul&gt;Chiaramente se qualcuno ha suggerimenti, segnalazione di bug, critiche, se vuole partecipare al progetto o se ha intenzione di utilizzare il control nel proprio sito, &lt;a href="mailto:info[at]peppedotnet.it" title="Scrivimi"&gt;la mia mail è sempre la stessa&lt;/a&gt; !
&lt;br /&gt;</content><link rel="alternate" type="text/html" href="/Blog/RepeaterPlus_v07.aspx" /><issued>2005-6-24T15:59:54+01:00</issued><modified>2005-6-24T15:59:54+01:00</modified></entry><entry><title>Creare password alfanumeriche</title><id>/Blog/Creare_password_alfanumeriche.aspx</id><created>2004-11-26T12:42:37+01:00</created><content type="text/html" mode="escaped">Sul forum di &lt;a href="http://www.devspy.com/Forum" title="Forum di DevSpy.com"&gt;DevSpy.com&lt;/a&gt;, è stato chiesto come poter creare delle password alfanumeriche da 12 caratteri presi a caso.
&lt;br /&gt;Ciò risulta molto semplice, utilizzando la classe System.Random:
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;private string password, pass;
&lt;br /&gt;private int n, l, c;
&lt;br /&gt;
&lt;br /&gt;public string generatePassword()
&lt;br /&gt;{
&lt;br /&gt;    Random casoNumeri = new Random();
&lt;br /&gt;    Random casoLettere = new Random();
&lt;br /&gt;    Random caso = new Random();
&lt;br /&gt;    string[] alfabeto = {"a","b","c","d","e","f",
&lt;br /&gt;                        "g","h","i","l","m","n",
&lt;br /&gt;                        "o","p","q","r","s","t",
&lt;br /&gt;                        "u","v","w","z"};
&lt;br /&gt;    for(int i=0; i&lt;6; i++)
&lt;br /&gt;    {
&lt;br /&gt;        n = casoNumeri.Next(0,9);
&lt;br /&gt;        l = casoLettere.Next(0,22);
&lt;br /&gt;        pass += n.ToString()+alfabeto[l];
&lt;br /&gt;    }
&lt;br /&gt;    char[] letters = pass.ToCharArray();
&lt;br /&gt;    for(int g=0; g&lt;letters.Length; g++)
&lt;br /&gt;    {
&lt;br /&gt;        c = caso.Next(0,9);
&lt;br /&gt;        password += letters[c].ToString();
&lt;br /&gt;    }
&lt;br /&gt;    return password;
&lt;br /&gt;}&lt;/code&gt;</content><link rel="alternate" type="text/html" href="/Blog/Creare_password_alfanumeriche.aspx" /><issued>2004-11-26T12:42:37+01:00</issued><modified>2004-11-26T12:42:37+01:00</modified></entry><entry><title>DirectoryInfo</title><id>/Blog/DirectoryInfo.aspx</id><created>2004-11-16T0:53:28+01:00</created><content type="text/html" mode="escaped">Vediamo un modo molto utile per ottenere delle informazioni sulle cartelle di nostro interesse. In questo caso stampiamo a video tutte le directory e i files presenti nella cartella della directory virtuale dove verrà posizionata la WebForm ASP.NET contenente questi due metodi:
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;public void page_Load(object sender, EventArgs e)
&lt;br /&gt;{
&lt;br /&gt;    this.getDirectoryInfo(Server.MapPath("/"));
&lt;br /&gt;}
&lt;br /&gt;
&lt;br /&gt;public void getDirectoryInfo(string path)
&lt;br /&gt;{
&lt;br /&gt;    DirectoryInfo dirInfo = new DirectoryInfo(path);
&lt;br /&gt;    DirectoryInfo[] cartelle = dirInfo.GetDirectories();
&lt;br /&gt;    lbl.Text = "&lt;b&gt;Cartelle:&lt;/b&gt;&lt;br /&gt;";
&lt;br /&gt;    foreach(DirectoryInfo cartella in cartelle)
&lt;br /&gt;    {
&lt;br /&gt;        lbl.Text += cartella.Name+"&lt;br /&gt;";
&lt;br /&gt;    }
&lt;br /&gt;    lbl.Text += "&lt;b&gt;Files:&lt;/b&gt;&lt;br /&gt;";
&lt;br /&gt;    FileInfo[] files = dirInfo.GetFiles();
&lt;br /&gt;    foreach(FileInfo file in files)
&lt;br /&gt;    {
&lt;br /&gt;        lbl.Text += file.Name+"&lt;br /&gt;";
&lt;br /&gt;    }
&lt;br /&gt;}&lt;/code&gt;
&lt;br /&gt;Inoltre possiamo ottenere tante altre proprietà riguardante la nostra cartella, come ad esempio la data di creazione (dirInfo.CreationTime), la data dell'ultimo accesso (dirInfo.LastAccessTime), la data di ultima scrittura (dirInfo.LastWriteTime) o la sua root (dirInfo.Root).
&lt;br /&gt;Tutto ciò ricordandosi di importare il namespace System.IO !!</content><link rel="alternate" type="text/html" href="/Blog/DirectoryInfo.aspx" /><issued>2004-11-16T0:53:28+01:00</issued><modified>2004-11-16T0:53:28+01:00</modified></entry><entry><title>System.Web.Mail - Spedire mail da pagine ASP.NET</title><id>/Blog/System.Web.Mail_spedire_mail.aspx</id><created>2004-11-2T14:34:35+01:00</created><content type="text/html" mode="escaped">E' il namespace che ci da la possibilità di interagire con il servizio SMTP del server su cui risiedono le noste pagine ASP.NET; tramite le sue classi, possiamo infatti mandare delle e-mail con poche righe di codice:
&lt;br /&gt;&lt;code&gt;&lt;%@ Page Language="C#" Debug="true" %&gt;
&lt;br /&gt;&lt;%@ import Namespace="System" %&gt;
&lt;br /&gt;&lt;%@ import Namespace="System.Web" %&gt;
&lt;br /&gt;&lt;%@ import Namespace="System.Web.Mail" %&gt;
&lt;br /&gt;&lt;script runat="server"&gt;
&lt;br /&gt;    private void sendMail(object sender, EventArgs e)
&lt;br /&gt;    {
&lt;br /&gt;        try
&lt;br /&gt;        {
&lt;br /&gt;            MailMessage mail = new MailMessage();
&lt;br /&gt;            mail.From = "PeppeDotNet.it";
&lt;br /&gt;            mail.To = "info@peppedotnet.it";
&lt;br /&gt;            mail.Subject = "Invio mail da una pagina ASP.NET";
&lt;br /&gt;            mail.Body = "Questa è una prova ...";
&lt;br /&gt;            SmtpMail.Send(mail);
&lt;br /&gt;        }
&lt;br /&gt;        catch(Exception exe)
&lt;br /&gt;        {
&lt;br /&gt;            lbl.Text = exe.Message+exe.StackTrace;
&lt;br /&gt;        }
&lt;br /&gt;    }
&lt;br /&gt;&lt;/script&gt;
&lt;br /&gt;&lt;html&gt;
&lt;br /&gt;    &lt;body&gt;
&lt;br /&gt;        &lt;form runat="server"&gt;
&lt;br /&gt;            &lt;asp:Button id="btn" runat="server" Text="Send" onClick="sendMail" /&gt;
&lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;            &lt;asp:Label id="lbl" runat="server" /&gt;
&lt;br /&gt;        &lt;/form&gt;
&lt;br /&gt;    &lt;/body&gt;
&lt;br /&gt;&lt;/html&gt;&lt;/code&gt;</content><link rel="alternate" type="text/html" href="/Blog/System.Web.Mail_spedire_mail.aspx" /><issued>2004-11-2T14:34:35+01:00</issued><modified>2004-11-2T14:34:35+01:00</modified></entry><entry><title>dotMSN</title><id>/Blog/dotMSN.aspx</id><created>2004-10-31T10:12:59+01:00</created><content type="text/html" mode="escaped">Ieri, girando nella rete, ho trovato questa interessantissima libreria scritta in c#:
&lt;br /&gt;&lt;a href="http://members.home.nl/b.geertsema/dotMSN/" title="dotMSN"&gt;dotMSN&lt;/a&gt;, una libreria di classi scritta in C#.NET che ci permette di utilizzare il servizio MSN Messenger; ci permette cioè di fare più o meno tutte le operazioni che si fanno normalmente con il caro Messenger:
&lt;br /&gt;- Connessione / Disconnessione
&lt;br /&gt;- Spedizione messaggi
&lt;br /&gt;- Aggiunta contatti
&lt;br /&gt;- Creazione gruppi
&lt;br /&gt;- Trasferimento files ... etc
&lt;br /&gt;Il tutto è contorniato da una gran bella &lt;a href="http://members.home.nl/b.geertsema/dotMSN/documentation/index.html" title="Documentazione"&gt;Documentazione&lt;/a&gt;.
&lt;br /&gt;Veramente un bel progetto ! Spero in un breve utilizzo ... ;-)</content><link rel="alternate" type="text/html" href="/Blog/dotMSN.aspx" /><issued>2004-10-31T10:12:59+01:00</issued><modified>2004-10-31T10:12:59+01:00</modified></entry><entry><title>Utilizzo del web control RangeValidator</title><id>/Blog/Utilizzo_control_RangeValidator.aspx</id><created>2004-10-24T16:39:27+01:00</created><content type="text/html" mode="escaped">Prendendo spunto da una domanda fatta da un utente sul &lt;a href="http://www.devspy.com/Forum" title="forum di DevSpy.com"&gt;forum di DevSpy.Com&lt;/a&gt;, in questo secondo post volevo parlare dei Validator di ASP.NET, facendo un esempio d'uso del RangeValidator.
&lt;br /&gt;Il RangeValidator è un controllo che permette allo sviluppatore di verificare che il contenuto inserito da un utente in una TexBox, sia compreso in un certo intervallo di numeri (interi o con la virgola), stringhe o date, semplicemente specificando il valore minimo e massimo di questo intervallo. Ecco un esempio d'uso :
&lt;br /&gt;
&lt;br /&gt;&lt;code&gt;&lt;%@ Page Language="C#" Debug="true"%&gt;
&lt;br /&gt;&lt;script runat="server"&gt;
&lt;br /&gt;
&lt;br /&gt;    private void btn_onClick(object sender, EventArgs e)
&lt;br /&gt;    {
&lt;br /&gt;        if(Page.IsValid)
&lt;br /&gt;        {
&lt;br /&gt;            lbl.Text = "Valore inserito: "+txt.Text;
&lt;br /&gt;        }
&lt;br /&gt;    }
&lt;br /&gt;
&lt;br /&gt;&lt;/script&gt;
&lt;br /&gt;&lt;html&gt;
&lt;br /&gt;    &lt;body&gt;
&lt;br /&gt;        &lt;form runat="server"&gt;
&lt;br /&gt;            &lt;asp:TextBox id="txt" runat="server" /&gt;
&lt;br /&gt;            &lt;asp:RangeValidator id="rv"
&lt;br /&gt;                ControlToValidate="txt"
&lt;br /&gt;                MaximumValue="10"
&lt;br /&gt;                MinimumValue="0"
&lt;br /&gt;                Type="Integer"
&lt;br /&gt;                ErrorMessage="Il valore inserito non è corretto !"
&lt;br /&gt;                runat="server" /&gt;
&lt;br /&gt;            &lt;br /&gt;
&lt;br /&gt;            &lt;asp:Button id="btn"
&lt;br /&gt;                onClick="btn_onClick"
&lt;br /&gt;                Text="Controlla"
&lt;br /&gt;                runat="server" /&gt;
&lt;br /&gt;            &lt;br /&gt;
&lt;br /&gt;            &lt;asp:Label id="lbl" runat="server" /&gt;
&lt;br /&gt;        &lt;/form&gt;
&lt;br /&gt;    &lt;/body&gt;
&lt;br /&gt;&lt;/html&gt;&lt;/code&gt;
&lt;br /&gt;Comodo no ?</content><link rel="alternate" type="text/html" href="/Blog/Utilizzo_control_RangeValidator.aspx" /><issued>2004-10-24T16:39:27+01:00</issued><modified>2004-10-24T16:39:27+01:00</modified></entry></feed>
