<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ASP.NET</title>
        <link>http://blogs.ugidotnet.org/matteomigliore/category/2765.aspx</link>
        <description>ASP.NET</description>
        <language>it-IT</language>
        <copyright>Matteo Migliore</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <item>
            <title>[ASP.NET] Sistema realtime di rilevamento degli utenti connessi</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2008/07/06/asp.net-sistema-realtime-di-rilevamento-degli-utenti-connessi.aspx</link>
            <description>Conoscere il numero preciso di utenti connessi in un’applicazione ASP.NET non è possibile, sfruttando ad esempio le Membership API è possibile ottenere il numero di utenti connessi usando come criterio discriminante il timeout della Session (Membership.GetNumberOfUsersOnline()). In questo modo però è possibile monitorare solamente gli utenti loggati e comunque il numero rimane piuttosto approssimato. &lt;br /&gt;
&lt;br /&gt;
Personalmente non ho mai avuto la necessità di tenere una traccia più accurata a scopo statistico, ma vediamo comunque come risolvere il problema :-). &lt;br /&gt;
&lt;br /&gt;
Ah, il famigerato evento &lt;a title="Google: Session end not firing" href="http://www.google.com/search?q=session+end+not+firing"&gt;Session.End *non* è deterministico&lt;/a&gt;, quindi non lo si può sfruttare per questo obiettivo. &lt;br /&gt;
&lt;br /&gt;
La soluzione è piuttosto semplice: &lt;br /&gt;
- un WebService che i client chiamano ciclicamente &lt;br /&gt;
- un timer Javascript che richiama il WebService  &lt;br /&gt;
&lt;a rel="lightbox" href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/matteomigliore/WindowsLiveWriter/4bda8f3382f8_B049/WebServer_Clients.jpg"&gt;&lt;img title="Web server structure" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" alt="Web server structure" border="0" src="http://1nw9vw.blu.livefilestore.com/y1pRc_GCV3KSLqnXhMlD3Q5yxoeB6cLe6ok28IC6t1VEIuHSr13k9dO8FoAJT8TIOjVPYkYu3BltL8/WebServer_Clients.JPG" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) L’attributo ScriptService permette di chiamare il web service tramite AJAX. &lt;br /&gt;
&lt;pre class="csharpcode2"&gt;[WebService(Namespace = &lt;span class="str"&gt;"http://eyeopen.org/"&lt;/span&gt;)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(&lt;span class="kwrd2"&gt;false&lt;/span&gt;)]
[ScriptService]
&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AliveService : WebService
{
    [WebMethod]
    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SendAlive()
    {
        &lt;span class="rem"&gt;////string sessionId = HttpContext.Current.Request.Params["ASP.NET_SessionId"];&lt;/span&gt;
        &lt;span class="kwrd2"&gt;string&lt;/span&gt; sessionId = HttpContext.Current.Request.UserHostAddress;
        UsersManager.RegisterUser(sessionId);
   }
}&lt;/pre&gt;
&lt;br /&gt;
&lt;p&gt;2) Il file Javascript necessario a chiamare il web service: &lt;br /&gt;
&lt;/p&gt;
&lt;pre class="csharpcode2"&gt;function SendAlive() {
    EyeOpen.UsersMonitor.Web.AliveService.SendAlive();
}

function AliveTimerTick() {
    SendAlive();
    setTimeout(AliveTimerTick, 1000);
}

&lt;span class="kwrd2"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt; (Sys) !== &lt;span class="str"&gt;"undefined"&lt;/span&gt;) {
    Sys.Application.notifyScriptLoaded();
}

setTimeout(AliveTimerTick, 1000);&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;3) Infine la reference al file Javascript tramite lo ScriptManager &lt;br /&gt;
e la reference al web service: &lt;br /&gt;
&lt;/p&gt;
&lt;pre class="csharpcode2"&gt;&lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="scriptManager"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Scripts&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptReference&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd2"&gt;="~/Js/Alive.js"&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Scripts&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Services&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ServiceReference&lt;/span&gt; &lt;span class="attr"&gt;Path&lt;/span&gt;&lt;span class="kwrd2"&gt;="~/Core/AliveService.asmx"&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Services&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:ScriptManager&lt;/span&gt;&lt;span class="kwrd2"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;br /&gt;
La rappresentazione della classe di supporto al web service:  &lt;br /&gt;
&lt;a rel="lightbox" href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/matteomigliore/WindowsLiveWriter/4bda8f3382f8_B049/UsersManager_2.jpg"&gt;&lt;img title="Classe di supporto al web service" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="212" alt="Classe di supporto al web service" width="153" border="0" src="http://1nw9vw.blu.livefilestore.com/y1pd8PpJWZ4ezNOZUXscs0Zsemegsd0ZR3g3buJTWhGwI1OsmxP4YHLx89ZNzch4O6X8BAmk6VXFbA/UsersManager.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
In sostanza il web service lato server viene chiamato da un timer javascript ogni secondo, con un basso carico di rete e sul server, segnalando la presenza dell’utente, nel momento in cui vengono chiuse tutte le pagine che richiamano il servizio entro 10 secondi (il tempo di timeout si gestisce tramite web.config) l’utente viene cancellato dalla lista degli utenti connessi. &lt;br /&gt;
&lt;br /&gt;
E’ sufficiente inserire lo ScriptManager in tutte le pagine (ad esempio tramite MasterPage o da codice) e il sistema viene esteso a tutta l’applicazione web. &lt;br /&gt;
&lt;br /&gt;
Qui si trova il progetto di esempio: &lt;a title="Eye Open [Project: EyeOpen.UsersMonitor.Web]" href="http://tinyurl.com/6fnqj9"&gt;EyeOpen.UsersMonitor.Web&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Matteo Migliore.&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/93292.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2008/07/06/asp.net-sistema-realtime-di-rilevamento-degli-utenti-connessi.aspx</guid>
            <pubDate>Sun, 06 Jul 2008 11:13:34 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/93292.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2008/07/06/asp.net-sistema-realtime-di-rilevamento-degli-utenti-connessi.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/93292.aspx</wfw:commentRss>
        </item>
        <item>
            <title>[ASP.NET] Validare i controlli della pagina dato il ValidationGroup</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2008/04/10/asp.net-validare-i-controlli-della-pagina-secondo-il-validationgroup.aspx</link>
            <description>&lt;p&gt;Posto questi due metodi perchè ho trovato divertente riuscire a rendere il codice così striminzito grazie a C# 3.0 e alla ricorsione: &lt;/p&gt;
&lt;div class="csharpcode2"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;  &lt;span class="kwrd2"&gt;private&lt;/span&gt; &lt;span class="kwrd2"&gt;void&lt;/span&gt; ValidateByGroup(&lt;span class="kwrd2"&gt;string&lt;/span&gt; validationGroup) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;   List&amp;lt;BaseValidator&amp;gt; validators = &lt;span class="kwrd2"&gt;new&lt;/span&gt; List&amp;lt;BaseValidator&amp;gt;(from validator &lt;span class="kwrd2"&gt;in&lt;/span&gt; FindControlsByType&amp;lt;BaseValidator&amp;gt;(&lt;span class="kwrd2"&gt;this&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                    &lt;span class="kwrd2"&gt;where&lt;/span&gt; validator.ValidationGroup == validationGroup select validator);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;   validators.ForEach(validator =&amp;gt; validator.Validate());&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;  }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;  &lt;span class="kwrd2"&gt;private&lt;/span&gt; &lt;span class="kwrd2"&gt;static&lt;/span&gt; IList&amp;lt;T&amp;gt; FindControlsByType&amp;lt;T&amp;gt;(Control root) &lt;span class="kwrd2"&gt;where&lt;/span&gt; T: Control {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;   List&amp;lt;T&amp;gt; controls = &lt;span class="kwrd2"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;();   &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;   &lt;span class="kwrd2"&gt;foreach&lt;/span&gt; (Control child &lt;span class="kwrd2"&gt;in&lt;/span&gt; root.Controls) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    Type type = child.GetType().BaseType;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;while&lt;/span&gt;(type != &lt;span class="kwrd2"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd2"&gt;object&lt;/span&gt;)){&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;     &lt;span class="kwrd2"&gt;if&lt;/span&gt; (type == &lt;span class="kwrd2"&gt;typeof&lt;/span&gt;(T))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;     {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;      controls.Add((T)child);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;      &lt;span class="kwrd2"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;     }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;     type = type.BaseType;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (child.HasControls())&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;     controls.AddRange(FindControl&amp;lt;T&amp;gt;(child));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;   }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;   &lt;span class="kwrd2"&gt;return&lt;/span&gt; controls;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
Perchè funzioni è necessario disabilitare il controllo lato client impostando a False la proprietà EnableClientScript dei validator. Per rendere comunque la pagina reattiva sarebbe bene sfruttare AJAX perchè in questo modo il controllo verrà fatto solo lato server. &lt;br /&gt;
&lt;br /&gt;
Matteo Migliore.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/92157.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2008/04/10/asp.net-validare-i-controlli-della-pagina-secondo-il-validationgroup.aspx</guid>
            <pubDate>Thu, 10 Apr 2008 10:21:06 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/92157.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2008/04/10/asp.net-validare-i-controlli-della-pagina-secondo-il-validationgroup.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/92157.aspx</wfw:commentRss>
        </item>
        <item>
            <title>[TimeTracker] Dal class-diagram al diagramma ER</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2008/01/07/timetracker-dal-class-diagram-al-diagramma-er.aspx</link>
            <description>&lt;div&gt;Ho iniziato a lavorare ad un progetto di cui parlerò fra qualche settimana. Anticipo che si tratta di un &lt;a title="Time Tracker Starter Kit : The Official Microsoft ASP.NET Site" href="http://www.asp.net/downloads/starter-kits/time-tracker/"&gt;TimeTracker&lt;/a&gt;, il cui scopo principale è quello di racchiudere vari principi del design object oriented e di metodologie di sviluppo del software. L'obiettivo sarebbe anche quello di creare un presentation layer che offra degli spunti concreti ed infine avere a disposizione un TimeTracker realmente utilizzabile.&lt;br /&gt;
&lt;br /&gt;
Nel frattempo scriverò qualche post durante "l'avanzamento dei lavori". Ho quasi terminato il disegno del &lt;a title="Class diagram on Wikipedia" href="http://en.wikipedia.org/wiki/Class_diagram"&gt;class diagram&lt;/a&gt; e la cosa che mi ha dato maggiormente soddisfazione al momento è il fatto di essere in grado di generare il database direttamente dal class diagram attraverso &lt;a title="hibernate.org - NHibernate for .NET" href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt; e la corretta definizione dei &lt;a title="Chapter 5. Basic O/R Mapping" href="http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping.html"&gt;file di mapping&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Per un motivo (database già esistente) o l'altro (mancanza di tempo) non ho mai sfruttato questa feature di NHibernate davvero utile. &lt;br /&gt;
&lt;br /&gt;
I due vantaggi sostanziali sono:&lt;br /&gt;
- possibilità di generare qualunque database supportato da NHibernate&lt;br /&gt;
- definizione dei vincoli nei file di mapping&lt;br /&gt;
&lt;br /&gt;
Anche se alla fine della fiera si tratta solamente di query T-SQL "create table" o "alter table", è stupefacente avere il database (Sql Server 2005) vuoto un momento e il momento dopo averlo completamente popolato ovviamente ottenendo gratis anche il &lt;a title="ER model on Wikipedia" href="http://en.wikipedia.org/wiki/Entity-relationship_model"&gt;database diagram&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Una cosa fatta meglio del diagramma ER (Management Studio) rispetto al class diagram (VIsual Studio 2008): il metodo di riorganizzazione del grafico... per il resto, beh è come sparare sulla croce rossa :-D. Il confronto tra i due modelli:&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;table style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td style="VERTICAL-ALIGN: top; MARGIN-RIGHT: 5px"&gt;Class diagram&lt;br /&gt;
            &lt;a href="http://farm3.static.flickr.com/2085/2173589876_2be671a8b4_o.jpg"&gt;&lt;img alt="Class diagram TimeTracker" src="http://farm3.static.flickr.com/2085/2173589876_e2570ca4fe_m.jpg" /&gt;&lt;/a&gt; &lt;/td&gt;
            &lt;td style="PADDING-LEFT: 5px"&gt;Diagramma ER&lt;br /&gt;
            &lt;a href="http://farm3.static.flickr.com/2085/2172798305_62808a6f94_o.jpg"&gt;&lt;img alt="Diagramma ER TimeTracker" src="http://farm3.static.flickr.com/2085/2172798305_bdb3411a66_m.jpg" /&gt;&lt;/a&gt; &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
Spero di avere abbastanza tempo per poter andare avanti speditamente :-). In teoria dovrebbe anche entrarci Silverlight 1.1 in minima parte, ma è da vedere.&lt;br /&gt;
&lt;br /&gt;
A breve seguiranno altre notizie.&lt;br /&gt;
&lt;br /&gt;
Matteo Migliore.&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/90583.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2008/01/07/timetracker-dal-class-diagram-al-diagramma-er.aspx</guid>
            <pubDate>Sun, 06 Jan 2008 23:45:07 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/90583.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2008/01/07/timetracker-dal-class-diagram-al-diagramma-er.aspx#feedback</comments>
            <slash:comments>10</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/90583.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Implementare un custom Membership provider con ASP.NET</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2007/10/26/implementare-un-custom-membership-provider-con-asp.net.aspx</link>
            <description>Un esempio su come scrivere un custom Membership provider per ASP.NET che consenta di validare correttamente la password nei vari metodi. &lt;br /&gt;
In particolare se la password non rispetta i vincoli imposti dal provider, la cosa da fare è lanciare un eccezione, che viene poi intercettata dai Login control e viene comunicato all'utente il problema. Bisogna inoltre invocare il metodo OnValidatingPassword, nel caso in cui la password sia corretta, per scatenare l'evento ValidatingPassword del provider. &lt;br /&gt;
Qui il codice:
&lt;pre class="csharpcode2"&gt;&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;override&lt;/span&gt; &lt;span class="kwrd2"&gt;bool&lt;/span&gt; ChangePassword(&lt;span class="kwrd2"&gt;string&lt;/span&gt; username, &lt;span class="kwrd2"&gt;string&lt;/span&gt; oldPassword, &lt;span class="kwrd2"&gt;string&lt;/span&gt; newPassword)
{
    PasswordCheck passwordCheck = IsValidPassword(newPassword);
    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (passwordCheck == PasswordCheck.MinRequiredPasswordLength)
        &lt;span class="kwrd2"&gt;throw&lt;/span&gt; &lt;span class="kwrd2"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"Password does not respects min required lenght."&lt;/span&gt;);

    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (passwordCheck == PasswordCheck.NonAlphanumericCharacters)
        &lt;span class="kwrd2"&gt;throw&lt;/span&gt; &lt;span class="kwrd2"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"Password does not respects alphanumeric lenght."&lt;/span&gt;);

    ValidatePasswordEventArgs e = &lt;span class="kwrd2"&gt;new&lt;/span&gt; ValidatePasswordEventArgs(username, newPassword, &lt;span class="kwrd2"&gt;false&lt;/span&gt;);
    OnValidatingPassword(e);
    &lt;span class="kwrd2"&gt;return&lt;/span&gt; &lt;span class="kwrd2"&gt;true&lt;/span&gt;;
}

&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;override&lt;/span&gt; MembershipUser CreateUser
    (&lt;span class="kwrd2"&gt;string&lt;/span&gt; username, &lt;span class="kwrd2"&gt;string&lt;/span&gt; password, 
     &lt;span class="kwrd2"&gt;string&lt;/span&gt; email, &lt;span class="kwrd2"&gt;string&lt;/span&gt; passwordQuestion, 
     &lt;span class="kwrd2"&gt;string&lt;/span&gt; passwordAnswer, &lt;span class="kwrd2"&gt;bool&lt;/span&gt; isApproved, 
     &lt;span class="kwrd2"&gt;object&lt;/span&gt; providerUserKey, &lt;span class="kwrd2"&gt;out&lt;/span&gt; MembershipCreateStatus status)
{
    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (IsValidPassword(password) != PasswordCheck.Valid) {
        status = MembershipCreateStatus.InvalidPassword;
        &lt;span class="kwrd2"&gt;return&lt;/span&gt; &lt;span class="kwrd2"&gt;null&lt;/span&gt;;
    }

    ValidatePasswordEventArgs e = &lt;span class="kwrd2"&gt;new&lt;/span&gt; ValidatePasswordEventArgs(username, password, &lt;span class="kwrd2"&gt;true&lt;/span&gt;);
    OnValidatingPassword(e);

    DateTime now = DateTime.Now;
    status = MembershipCreateStatus.Success;
    MembershipUser user = &lt;span class="kwrd2"&gt;new&lt;/span&gt; MembershipUser
        (&lt;span class="kwrd2"&gt;this&lt;/span&gt;.GetType().Name, username, Guid.NewGuid(), 
         email, passwordQuestion, &lt;span class="kwrd2"&gt;string&lt;/span&gt;.Empty, &lt;span class="kwrd2"&gt;true&lt;/span&gt;, &lt;span class="kwrd2"&gt;false&lt;/span&gt;, 
         now, now, now, now, now);
    HttpContext.Current.Cache[user.UserName] = user;
    &lt;span class="kwrd2"&gt;return&lt;/span&gt; user;
}

&lt;span class="kwrd2"&gt;private&lt;/span&gt; &lt;span class="kwrd2"&gt;enum&lt;/span&gt; PasswordCheck { 
    Valid = 0,
    NonAlphanumericCharacters = 2,
    MinRequiredPasswordLength = 4
}

&lt;span class="kwrd2"&gt;private&lt;/span&gt; PasswordCheck IsValidPassword(&lt;span class="kwrd2"&gt;string&lt;/span&gt; password) {
    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (password.Length &amp;lt; &lt;span class="kwrd2"&gt;this&lt;/span&gt;.MinRequiredPasswordLength)
        &lt;span class="kwrd2"&gt;return&lt;/span&gt; PasswordCheck.MinRequiredPasswordLength;

    &lt;span class="kwrd2"&gt;int&lt;/span&gt; nonAlphanumericCharacters = 0;
    &lt;span class="kwrd2"&gt;for&lt;/span&gt; (&lt;span class="kwrd2"&gt;int&lt;/span&gt; i = 0; i &amp;lt; password.Length; i++)
    {
        &lt;span class="kwrd2"&gt;if&lt;/span&gt; (!&lt;span class="kwrd2"&gt;char&lt;/span&gt;.IsLetterOrDigit(password, i))
            nonAlphanumericCharacters++;
    }

    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (nonAlphanumericCharacters &amp;lt; &lt;span class="kwrd2"&gt;this&lt;/span&gt;.MinRequiredNonAlphanumericCharacters)
        &lt;span class="kwrd2"&gt;return&lt;/span&gt; PasswordCheck.NonAlphanumericCharacters;

    &lt;span class="kwrd2"&gt;return&lt;/span&gt; PasswordCheck.Valid;
}

&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;override&lt;/span&gt; MembershipUser GetUser(&lt;span class="kwrd2"&gt;string&lt;/span&gt; username, &lt;span class="kwrd2"&gt;bool&lt;/span&gt; userIsOnline)
{
    MembershipUser user = HttpContext.Current.Cache[username] &lt;span class="kwrd2"&gt;as&lt;/span&gt; MembershipUser;
    &lt;span class="kwrd2"&gt;return&lt;/span&gt; user;
}

&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;override&lt;/span&gt; &lt;span class="kwrd2"&gt;bool&lt;/span&gt; ValidateUser(&lt;span class="kwrd2"&gt;string&lt;/span&gt; username, &lt;span class="kwrd2"&gt;string&lt;/span&gt; password)
{
    MembershipUser user = HttpContext.Current.Cache[username] &lt;span class="kwrd2"&gt;as&lt;/span&gt; MembershipUser;
    &lt;span class="kwrd2"&gt;return&lt;/span&gt; ((user != &lt;span class="kwrd2"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; user.GetPassword().Equals(password));
}&lt;/pre&gt;
&lt;br /&gt;
Matteo Migliore.&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/89215.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2007/10/26/implementare-un-custom-membership-provider-con-asp.net.aspx</guid>
            <pubDate>Thu, 25 Oct 2007 22:07:46 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/89215.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2007/10/26/implementare-un-custom-membership-provider-con-asp.net.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/89215.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Creare un menu con il controllo Repeater</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/31/creare-un-menu-con-il-controllo-repeater.aspx</link>
            <description>&lt;p&gt;Da un'altra &lt;a href="http://www.nnseek.com/e/microsoft.public.it.dotnet.asp/output_con_itemdatabound_era_il_mio_menu_22340707t.html"&gt;richiesta&lt;/a&gt; su NG :-D, dovrò creare un angolo dedicato, forse in articoli :-), un problema semplice ma non molto per chi è all'inizio: come creare un menu con il controllo Repeater.&lt;br /&gt;
&lt;br /&gt;
Questo esempio parte dal presupposto di avere la struttura delle pagine in uno storage (DB), per questo sarebbe più corretto implementare un SiteMapProvider, come &lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/02/WickedCode/"&gt;questo&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Per semplificare però eseguo il binding direttamente con un ObjectDataSource.&lt;br /&gt;
&lt;br /&gt;
Il codice html della pagina:&lt;br /&gt;
&lt;/p&gt;
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ObjectDataSource&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="ObjectDataSource1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;SelectMethod&lt;/span&gt;&lt;span class="kwrd2"&gt;="GetAll"&lt;/span&gt; &lt;span class="attr"&gt;TypeName&lt;/span&gt;&lt;span class="kwrd2"&gt;="SectionsDataSource"&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Repeater&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="rptMenu"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;OnItemDataBound&lt;/span&gt;&lt;span class="kwrd2"&gt;="rptMenu_ItemDataBound"&lt;/span&gt; &lt;span class="attr"&gt;DataSourceID&lt;/span&gt;&lt;span class="kwrd2"&gt;="ObjectDataSource1"&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;HeaderTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ul&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;HeaderTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:HyperLink&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="hypSection"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="attr"&gt;NavigateUrl&lt;/span&gt;&lt;span class="kwrd2"&gt;='&amp;lt;%# DataBinder.Eval(Container.DataItem, "Url") %&amp;gt;'&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd2"&gt;='&amp;lt;%# DataBinder.Eval(Container.DataItem, "Name") %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;li&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;FooterTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ul&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;FooterTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Repeater&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Il code-behind:&lt;br /&gt;
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;protected&lt;/span&gt; &lt;span class="kwrd2"&gt;void&lt;/span&gt; rptMenu_ItemDataBound(&lt;span class="kwrd2"&gt;object&lt;/span&gt; sender, RepeaterItemEventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;if&lt;/span&gt; ((!e.Item.ItemType.Equals(ListItemType.Item)) &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &amp;amp;&amp;amp; (!e.Item.ItemType.Equals(ListItemType.AlternatingItem)))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    Section section = e.Item.DataItem &lt;span class="kwrd2"&gt;as&lt;/span&gt; Section;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    HyperLink hypSection = e.Item.FindControl(&lt;span class="str"&gt;"hypSection"&lt;/span&gt;) &lt;span class="kwrd2"&gt;as&lt;/span&gt; HyperLink;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;string&lt;/span&gt; virtualPath = VirtualPathUtility.ToAppRelative(Request.Path).ToLower();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="rem"&gt;//Check if the current item url is the current section&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;if&lt;/span&gt; (section.Url.Equals(virtualPath, StringComparison.InvariantCultureIgnoreCase)) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        hypSection.NavigateUrl = &lt;span class="kwrd2"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        hypSection.CssClass = &lt;span class="str"&gt;"currentSection"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
La classe Section:&lt;br /&gt;
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;class&lt;/span&gt; Section&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; Section(&lt;span class="kwrd2"&gt;string&lt;/span&gt; name, &lt;span class="kwrd2"&gt;string&lt;/span&gt; url) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;this&lt;/span&gt;.name = name;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;this&lt;/span&gt;.url = url;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;string&lt;/span&gt; name;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;string&lt;/span&gt; Name&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        get { &lt;span class="kwrd2"&gt;return&lt;/span&gt; name; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        set { name = &lt;span class="kwrd2"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;string&lt;/span&gt; url;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;string&lt;/span&gt; Url&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        get { &lt;span class="kwrd2"&gt;return&lt;/span&gt; url; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        set { url = &lt;span class="kwrd2"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Ed infine il data source:
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;class&lt;/span&gt; SectionsDataSource&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; IList&amp;lt;Section&amp;gt; GetAll() {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        List&amp;lt;Section&amp;gt; sections = &lt;span class="kwrd2"&gt;new&lt;/span&gt; List&amp;lt;Section&amp;gt;();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        sections.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Section(&lt;span class="str"&gt;"Home"&lt;/span&gt;, &lt;span class="str"&gt;"~/default.aspx"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        sections.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Section(&lt;span class="str"&gt;"Contacts"&lt;/span&gt;, &lt;span class="str"&gt;"~/contacts.aspx"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        sections.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Section(&lt;span class="str"&gt;"Where"&lt;/span&gt;, &lt;span class="str"&gt;"~/where.aspx"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;return&lt;/span&gt; sections;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    }    &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;a href="http://www.esnips.com/nsdoc/f3084e51-a64f-4c97-8041-a25300e754ff"&gt;Qui&lt;/a&gt; si trova il codice dell'esempio. Matteo Migliore.&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/88053.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/31/creare-un-menu-con-il-controllo-repeater.aspx</guid>
            <pubDate>Fri, 31 Aug 2007 20:09:03 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/88053.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/31/creare-un-menu-con-il-controllo-repeater.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/88053.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Cancellazione multipla con Repeater e ObjectDataSource</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/29/cancellazione-multipla-con-repeater-e-objectdatasource.aspx</link>
            <description>&lt;div&gt;Sempre a seguito di una &lt;a href="http://www.nnseek.com/e/microsoft.public.it.dotnet.asp/operazioni_sui_record_di_un_repeater_selezionato_22207843t.html"&gt;domanda&lt;/a&gt; su NG ho scritto un breve esempio che mostra come eseguire la cancellazione multipla di "record" usando un Repeaer e un'ObjectDataSource.&lt;br /&gt;
&lt;br /&gt;
L'esempio è composto da un'entity Student e da una classe che si occupa della persistenza StudentDataSource.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.esnips.com/nsdoc/60ba2278-9625-426f-9a89-0b5d45767f1d"&gt;Qui&lt;/a&gt; è possibile scaricare l'esempio, di seguito il codice.&lt;br /&gt;
&lt;br /&gt;
Classe Student:
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;class&lt;/span&gt; Student&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; Student() { }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; Student(Guid id, &lt;span class="kwrd2"&gt;string&lt;/span&gt; name) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;this&lt;/span&gt;.id = id;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;this&lt;/span&gt;.name = name;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    Guid id;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; Guid Id&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        get { &lt;span class="kwrd2"&gt;return&lt;/span&gt; id; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        set { id = &lt;span class="kwrd2"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;string&lt;/span&gt; name;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;string&lt;/span&gt; Name&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        get { &lt;span class="kwrd2"&gt;return&lt;/span&gt; name; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        set { name = &lt;span class="kwrd2"&gt;value&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;override&lt;/span&gt; &lt;span class="kwrd2"&gt;bool&lt;/span&gt; Equals(&lt;span class="kwrd2"&gt;object&lt;/span&gt; obj) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;if&lt;/span&gt; (obj == &lt;span class="kwrd2"&gt;null&lt;/span&gt; || GetType() != obj.GetType())&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;return&lt;/span&gt; &lt;span class="kwrd2"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        Student other = obj &lt;span class="kwrd2"&gt;as&lt;/span&gt; Student;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;return&lt;/span&gt; (&lt;span class="kwrd2"&gt;this&lt;/span&gt;.Id.Equals(other.Id));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;override&lt;/span&gt; &lt;span class="kwrd2"&gt;int&lt;/span&gt; GetHashCode() {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;return&lt;/span&gt; Id.GetHashCode();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Classe StudentDataSource: &lt;br /&gt;
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;class&lt;/span&gt; StudentDataSource&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    IList&amp;lt;Student&amp;gt; Students {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        get {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;if&lt;/span&gt; (HttpContext.Current.Cache[&lt;span class="str"&gt;"Students"&lt;/span&gt;] == &lt;span class="kwrd2"&gt;null&lt;/span&gt;) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                HttpContext.Current.Cache[&lt;span class="str"&gt;"Students"&lt;/span&gt;] = &lt;span class="kwrd2"&gt;new&lt;/span&gt; List&amp;lt;Student&amp;gt;();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                Fill();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;return&lt;/span&gt; HttpContext.Current.Cache[&lt;span class="str"&gt;"Students"&lt;/span&gt;] &lt;span class="kwrd2"&gt;as&lt;/span&gt; IList&amp;lt;Student&amp;gt;; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        }        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;void&lt;/span&gt; Fill() {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        Students.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Student(Guid.NewGuid(), &lt;span class="str"&gt;"Bill"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        Students.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Student(Guid.NewGuid(), &lt;span class="str"&gt;"Steve"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        Students.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Student(Guid.NewGuid(), &lt;span class="str"&gt;"John"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        Students.Add(&lt;span class="kwrd2"&gt;new&lt;/span&gt; Student(Guid.NewGuid(), &lt;span class="str"&gt;"Martin"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; IList&amp;lt;Student&amp;gt; GetAll() {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;return&lt;/span&gt; Students;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; Student Get(Guid id) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        Student student = &lt;span class="kwrd2"&gt;new&lt;/span&gt; Student();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        student.Id = id;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;int&lt;/span&gt; position = Students.IndexOf(student);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;if&lt;/span&gt; (position &amp;gt;= 0)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;return&lt;/span&gt; Students[position];&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;return&lt;/span&gt; &lt;span class="kwrd2"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;public&lt;/span&gt; &lt;span class="kwrd2"&gt;void&lt;/span&gt; Delete(Student &lt;span class="kwrd2"&gt;value&lt;/span&gt;) {        &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        Students.Remove(&lt;span class="kwrd2"&gt;value&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Il codice HTML: &lt;br /&gt;
&lt;div class="csharpcode2"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:ObjectDataSource&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="ObjectDataSource1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="attr"&gt;DataObjectTypeName&lt;/span&gt;&lt;span class="kwrd2"&gt;="Student"&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        &lt;span class="attr"&gt;SelectMethod&lt;/span&gt;&lt;span class="kwrd2"&gt;="GetAll"&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="attr"&gt;TypeName&lt;/span&gt;&lt;span class="kwrd2"&gt;="StudentDataSource"&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Repeater&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="Repeater1"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;DataSourceID&lt;/span&gt;&lt;span class="kwrd2"&gt;="ObjectDataSource1"&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;input&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd2"&gt;="hidden"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd2"&gt;="hidKey"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd2"&gt;='&amp;lt;%# DataBinder.Eval(Container.DataItem, "Id") %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:CheckBox&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="chkDelete"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            &lt;span class="attr"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Label&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="lblName"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd2"&gt;='&amp;lt;%# DataBinder.Eval(Container.DataItem, "Name") %&amp;gt;'&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;ItemTemplate&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;asp:Repeater&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;br&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;asp:Button&lt;/span&gt; &lt;span class="attr"&gt;ID&lt;/span&gt;&lt;span class="kwrd2"&gt;="btnDelete"&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd2"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd2"&gt;="Delete"&lt;/span&gt; &lt;span class="attr"&gt;OnClick&lt;/span&gt;&lt;span class="kwrd2"&gt;="btnDelete_Click"&lt;/span&gt; &lt;span class="kwrd2"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;div&lt;/span&gt;&lt;span class="kwrd2"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Il codice che esegue la cancellazione:
&lt;div class="csharpcode2"&gt;
&lt;pre class="csharpcode2"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd2"&gt;protected&lt;/span&gt; &lt;span class="kwrd2"&gt;void&lt;/span&gt; btnDelete_Click(&lt;span class="kwrd2"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    StudentDataSource studentDataSource = &lt;span class="kwrd2"&gt;new&lt;/span&gt; StudentDataSource();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd2"&gt;foreach&lt;/span&gt; (RepeaterItem item &lt;span class="kwrd2"&gt;in&lt;/span&gt; Repeater1.Items) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        CheckBox chkDelete = item.FindControl(&lt;span class="str"&gt;"chkDelete"&lt;/span&gt;) &lt;span class="kwrd2"&gt;as&lt;/span&gt; CheckBox;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd2"&gt;if&lt;/span&gt; (chkDelete.Checked) {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            HtmlInputHidden hidKey = item.FindControl(&lt;span class="str"&gt;"hidKey"&lt;/span&gt;) &lt;span class="kwrd2"&gt;as&lt;/span&gt; HtmlInputHidden;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            Guid key = &lt;span class="kwrd2"&gt;new&lt;/span&gt; Guid(hidKey.Value);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            Student student = studentDataSource.Get(key);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            Response.Write(student.Name + &lt;span class="str"&gt;" deleted&amp;lt;br/&amp;gt;"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            studentDataSource.Delete(student);                &lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    Repeater1.DataBind();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Matteo Migliore.&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/88012.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/29/cancellazione-multipla-con-repeater-e-objectdatasource.aspx</guid>
            <pubDate>Wed, 29 Aug 2007 14:29:34 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/88012.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2007/08/29/cancellazione-multipla-con-repeater-e-objectdatasource.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/88012.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Il .NET Framework 3.5, tutto in poche righe</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2007/07/06/84776.aspx</link>
            <description>&lt;p&gt;In genere non mi piace postare contenuti che non siano miei ed originali, ma faccio un'eccezione, vista la chiarezza di quanto riporto più in basso.&lt;br /&gt;
&lt;br /&gt;
Volete conoscere e riassumere tutte le novità del .NET Framework 3.5 rispetto alle versioni precedenti in una pagina? &lt;br /&gt;
&lt;br /&gt;
Qui trovate il decalogo:&lt;br /&gt;
&lt;a href="http://www.danielmoth.com/Blog/2007/06/net-framework-35.html"&gt;http://www.danielmoth.com/Blog/2007/06/net-framework-35.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Fonte:&lt;br /&gt;
&lt;a title="http://programmazione.it/index.php?entity=eitem&amp;amp;idItem=36815" href="http://programmazione.it/index.php?entity=eitem&amp;amp;idItem=36815"&gt;http://programmazione.it/index.php?entity=eitem&amp;amp;idItem=36815&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Matteo Migliore.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/84776.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2007/07/06/84776.aspx</guid>
            <pubDate>Thu, 05 Jul 2007 22:56:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/84776.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2007/07/06/84776.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/84776.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Un nuovo, semplice CMS in ASP.NET 2.0, Open ovviamente</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2007/06/08/80793.aspx</link>
            <description>&lt;br /&gt;
&lt;p&gt;&lt;img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" alt="SampleCMS" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=SampleCMS&amp;amp;DownloadId=19452" /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.codeplex.com/SampleCMS"&gt;SampleCMS&lt;/a&gt;: un semplice CMS per beginners.&lt;br /&gt;
&lt;br /&gt;
Questa notte, a seguito di varie richieste sul NG di ASP.NET a cui mi stò dedicando parecchio ultimamente, ho sviluppato un piccolo, anzi micro :-), CMS&lt;br /&gt;
che dovrebbe permettere ai beginners di capire quali sono le basi, il funzionamento così da poter iniziare a sviluppare una soluzione in, quasi, completa autonomia.&lt;br /&gt;
&lt;br /&gt;
Sarei tentanto di iniziare a farcire il progetto di funzionlità, come un editor per la creazione dinamica di layout, ma questo stravolgerebbe la natura del progetto, che vorrei mantenere semplice, senza installazioni e configurazioni complesse come per i suoi fratelli "molto" maggiori: &lt;a href="http://www.dotnetnuke.com/"&gt;DotNetNuke&lt;/a&gt;, &lt;a href="http://umbraco.org/"&gt;Umbraco&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
E' possibile stabilire per ogni sezione se usare il layout di default oppure&lt;br /&gt;
una nuova pagina ASPX che utilizza una MasterPage.&lt;br /&gt;
Per la gestione dei contenuti ho creato un meccanismo a provider come per le Membership API, attualmente ce ne sono 2: un fake provider che restituisce un contenuto statico e un xml provider che persiste i contenuti in file xml.  &lt;/p&gt;
&lt;p&gt;Ogni commento è ben accetto ovviamente.&lt;br /&gt;
&lt;br /&gt;
Lo trovate su CodePlex: &lt;a href="http://www.codeplex.com/SampleCMS"&gt;http://www.codeplex.com/SampleCMS&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:d9c45aaa-4516-4186-a565-09eb98aa1ce4" contenteditable="false" style="PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET%202.0"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET%20CMS"&gt;ASP.NET CMS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/80793.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2007/06/08/80793.aspx</guid>
            <pubDate>Fri, 08 Jun 2007 13:28:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/80793.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2007/06/08/80793.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/80793.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Sicurezza delle applicazioni ASP.NET e dimensioni pagine: 1 shot, 2 pigeons</title>
            <link>http://blogs.ugidotnet.org/matteomigliore/archive/2007/04/19/75885.aspx</link>
            <description>&lt;p&gt;Grazie all'adaptive rendering di ASP.NET, cambiare il modo in cui vengono renderizzati i controlli è molto semplice; è sufficiente creare una classe che erediti da System.Web.UI.Adapters.ControlAdapter e ridefinire l'html che sì vuole emettere.&lt;/p&gt;
&lt;p&gt;Qui sì trova un articolo di &lt;a href="http://blogs.aspitalia.com/ricciolo/"&gt;Cristian Civera&lt;/a&gt; &lt;a href="http://www.microsoft.com/italy/msdn/risorsemsdn/sviluppoweb/adrendering.mspx"&gt;http://www.microsoft.com/italy/msdn/risorsemsdn/sviluppoweb/adrendering.mspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Modificando il modo in cui sì renderizza la pagina però sì possono anche risolvere definitivamente alcuni problemi: è possibile memorizzare il ViewState, che arriva anche a qualche centinaio di kbyte, 
anzichè nella pagina come accade di default, in Session emettendo verso il client solamente un Id.&lt;br /&gt;
&lt;br /&gt;
In questo modo sì migliora la sicurezza poichè il ViewState non va avanti e indietro [roundtrip] da client a server e sì risparmia molta banda. Davvero notevole!&lt;br /&gt;
&lt;br /&gt;
Ecco un esempio dell'adapter:&lt;br /&gt;
&lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx"&gt;http://msdn2.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
E qui un altro sistema per sfruttarlo:&lt;br /&gt;
&lt;a href="http://msdn2.microsoft.com/en-us/library/aa479403.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa479403.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Usandolo sì otterrano anche migliori risultati nell'indicizzazione sui motori di ricerca, Google :-), poichè in questo modo aumenta la densità delle parole chiave!&lt;br /&gt;
&lt;br /&gt;
Matteo Migliore.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/matteomigliore/aggbug/75885.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Matteo Migliore</dc:creator>
            <guid>http://blogs.ugidotnet.org/matteomigliore/archive/2007/04/19/75885.aspx</guid>
            <pubDate>Thu, 19 Apr 2007 09:37:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/matteomigliore/comments/75885.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/matteomigliore/archive/2007/04/19/75885.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/matteomigliore/comments/commentRss/75885.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
