<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 AJAX</title>
        <link>http://blogs.ugidotnet.org/dsantarelli/category/ASP.NET AJAX.aspx</link>
        <description>ASP.NET AJAX</description>
        <language>it-IT</language>
        <copyright>Dario Santarelli</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>jQuery e ASP.NET Ajax: $(document).ready() VS asynchronous postback</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/09/jquery-e-asp.net-ajax-document.ready-vs-asynchronous-postback.aspx</link>
            <description>Molto spesso capita di dover integrare, anche solo per semplici miglioramenti grafici, dei plugin jQuery all’interno delle nostre pagine ASP.NET. Gran parte delle volte l’impatto è indolore mentre in alcuni casi specifici occorre far riferimento ad accorgimenti non banali, soprattutto quando c’è di mezzo ASP.NET Ajax.   Il classico esempio si verifica quando ci si aspetta che la funzione $(document).ready() venga chiamata correttamente anche dopo un asynchronous postback tramite UpdatePanel. Infatti, la funzione $(document).ready() permette di determinare il momento in cui il DOM della pagina è caricato dal browser. Tuttavia, in caso di asynchronous postback il DOM può essere eventualmente modificato e non ricaricato nuovamente. Quindi il nostro codice javascript nella forma:      $(document).ready(function()       {       // codice...       });     ... non verrà eseguito!    Un workaround molto semplice per questo tipo di situazione è quello di sfruttare l’evento client-side endRequest generato dopo un postback asincrono, quando il controllo viene  restituito al browser. Agganciando il nostro codice jQuery che usa $(document).ready() all’interno di un opportuno event Handler per tale evento possiamo risolvere il problema. Ecco un semplice esempio:      &amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %&amp;gt;       &amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;       &amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;       &amp;lt;head runat="server"&amp;gt;         &amp;lt;title&amp;gt;jQuery .ready() function and asynchronous postback&amp;lt;/title&amp;gt;        &amp;lt;/head&amp;gt;     &amp;lt;body&amp;gt;       &amp;lt;form id="mainForm" runat="server"&amp;gt;         &amp;lt;div&amp;gt;           &amp;lt;asp:ScriptManager ID="scriptManager" runat="server"&amp;gt;             &amp;lt;Scripts&amp;gt;              &amp;lt;asp:ScriptReference Path="http://code.jquery.com/jquery-latest.js" /&amp;gt;             &amp;lt;/Scripts&amp;gt;           &amp;lt;/asp:ScriptManager&amp;gt;           &amp;lt;asp:UpdatePanel ID="updatePanel" runat="server"&amp;gt;             &amp;lt;ContentTemplate&amp;gt;                          &amp;lt;asp:Button ID="btnTest" runat="server" Text="Do Async PostBack" /&amp;gt;             &amp;lt;/ContentTemplate&amp;gt;           &amp;lt;/asp:UpdatePanel&amp;gt;          &amp;lt;/div&amp;gt;         &amp;lt;/form&amp;gt;                    &amp;lt;script type="text/javascript"&amp;gt;               Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);             function EndRequestHandler(sender, args)           {           if (args.get_error() == undefined) Test();                }               function Test()           {           $(document).ready(function()             {             alert('$(document).ready() called!!!');             });         }               Test();                                   &amp;lt;/script&amp;gt;        &amp;lt;/body&amp;gt;     &amp;lt;/html&amp;gt;               Technorati Tag: jQuery,ASP.NET,Ajax,DOM&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/95644.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/09/jquery-e-asp.net-ajax-document.ready-vs-asynchronous-postback.aspx</guid>
            <pubDate>Mon, 09 Mar 2009 22:58:18 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2009/03/09/jquery-e-asp.net-ajax-document.ready-vs-asynchronous-postback.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/95644.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/95644.aspx</trackback:ping>
        </item>
        <item>
            <title>Caricamento dinamico di UserControl via jQuery Ajax e HttpHandler</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/21/caricamento-dinamico-di-usercontrol-via-jquery-ajax-e-httphandler.aspx</link>
            <description>In applicazioni Web di una certa complessità, spesso le classiche tecniche di caricamento dinamico di UserControl tramite PostBack o UpdatePanel rischiano di rendere lo sviluppo delle pagine molto complesso nonché, cosa più pericolosa, non performante. Di certo uno scenario maggiormente flessibile dovrebbe anzitutto ridurre al minimo il traffico da/verso il server (vedi "UpdatePanel e i suoi abusi") ma soprattutto permettere di richiedere il caricamento di contenuti on-demand sfruttando la potenza di AJAX.     In questo esempio voglio mostrare quanto sia semplice implementare un' infrastruttura di base che permetta il caricamento dinamico di UserControl tramite jQuery AJAX (client-side) e un HttpHandler (server-side). In breve:     Il client richiede all'HttpHandler uno UserControl con una richiesta JSON     L'HttpHandler processa la richiesta inizializzando solo lo UserControl desiderato ed inviando al client solo l' (X)Html di rendering dello UserControl     Il client posiziona l' (X)Html ricevuto in una zona specifica della pagina    Ovviamente esistono altri modi per creare dinamicamente UserControl con AJAX (es. tramite WebService), ma per brevità tralasciamo volutamente questo aspetto.  1. Il DataContract della richiesta       Anzitutto abbiamo bisogno di una classe che faccia da DataContract per la richiesta di uno UserControl. In particolare, la proprietà ControlParameters permette di specificare degli eventuali parametri da passare allo UserControl per pilotarne il corretto comportamento.         [DataContract]       public class ControlRequest        {      [DataMember]         public string ControlName { get; set; }               [DataMember]         public Dictionary&amp;lt;string, string&amp;gt; ControlParameters { get; set; }       }             2. HttpHandler       Server-side abbiamo un HttpHandler che deserializza le richieste JSON conformi al DataContract sopra specificato per caricare ed inizializzare correttamente (tramite reflection) lo UserControl richiesto. Il codice si commenta quasi da solo :D  public class UserControlHandler : IHttpHandler       {      public void ProcessRequest (HttpContext context)         {                     // 1. Deserializzazione della richiesta JSON            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ControlRequest));           ControlRequest controlRequest = serializer.ReadObject(context.Request.InputStream) as ControlRequest;                   // 2. Caricamento dello UserControl             Page page = new Page();           UserControl userControl = (UserControl)page.LoadControl("~/Controls/" + controlRequest.ControlName + ".ascx");                   userControl.EnableViewState = false;                  // 3. Inizializzazione dei parametri dello UserControl via Reflection           SetControlParameters(controlRequest, userControl);                // 4. Esecuzione dello UserControl all'interno di un form        HtmlForm form = new HtmlForm();         form.Controls.Add(userControl);        page.Controls.Add(form);            StringWriter textWriter = new StringWriter();         HttpContext.Current.Server.Execute(page, textWriter, false);        // 5. Invio dell'html di rendering dello UserControl (senza il form contenitore)             context.Response.ContentType = "text/html";         context.Response.ContentEncoding = System.Text.Encoding.UTF8;         context.Response.Write(Regex.Replace(textWriter.ToString(), @"&amp;lt;[/]?(form)[^&amp;gt;]*?&amp;gt;", string.Empty, RegexOptions.IgnoreCase));               }        private void SetControlParameters(ControlRequest request, UserControl userControl)       {        foreach (string parameterName in request.ControlParameters.Keys)         {          PropertyInfo property = userControl.GetType().GetProperty(parameterName);           if (property != null) property.SetValue(userControl, request.ControlParameters[parameterName], null);         }      }                ...       }      Let's try!!!  Supponiamo di avere nella nostra soluzione uno UserControl CustomersGridView.ascx il cui codebehind include la complicatissima logica per popolare e filtare la classica griglia di Customers.       public partial class CustomersGridView : System.Web.UI.UserControl        {        public string FilterExpression { get; set; }               protected void NorthwindSqlDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e)         {          e.Command.Parameters["@ContactName"].Value = FilterExpression;         }      }            Come possiamo notare la proprietà FilterExpression esposta serve proprio per determinare il filtraggio dei customer in fase di popolamento della GridView.     A questo punto non rimane che creare la nostra pagina di test:     &amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" 
         EnableViewState="false" %&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
&amp;lt;head runat="server"&amp;gt;
    &amp;lt;title&amp;gt;Dynamic UserControl Loading via jQuery Ajax and HttpHandler&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;   
    &amp;lt;form id="form1" runat="server"&amp;gt;
     &amp;lt;asp:ScriptManager ID="scriptManager" runat="server"&amp;gt;
        &amp;lt;Scripts&amp;gt;
            &amp;lt;asp:ScriptReference Path="~/scripts/jquery-1.2.6.pack.js" ScriptMode="Release" /&amp;gt;
            &amp;lt;asp:ScriptReference Path="~/scripts/jquery.json-1.3.min.js" ScriptMode="Release" /&amp;gt;
        &amp;lt;/Scripts&amp;gt;
    &amp;lt;/asp:ScriptManager&amp;gt;
    &amp;lt;div&amp;gt;                
        ContactName: 
        &amp;lt;input id="txtCustomer" type="text" /&amp;gt; 
        &amp;lt;input type="button" value="Search" onclick="SearchCustomer()" /&amp;gt;
        &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id="testDiv"&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;lt;script type="text/javascript"&amp;gt;
        function getData(request) 
        {           
            $.ajax            ({
                type: "POST",
                contentType: "application/json; charset=utf-8",
                url: "UserControlHandler.ashx",
                data: $.toJSON(request), // Uso del plugin jquery.json                                               
                success: function(msg) { $('#testDiv').html(msg); }, // 'testDiv' viene popolato con l'Html di rendering dello UserControl
                error: function(XMLHttpRequest, textStatus, errorThrown) { alert("Error Occured!"); }
            });
        }

        function SearchCustomer()
        {
            var filterExpression = $('#txtCustomer').val();
            var request = {ControlName:'CustomersGridView',ControlParameters:[{Key:'FilterExpression',Value:filterExpression}]};                  
            getData(request);
        }        
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;



  Al click del button "Search" viene invocata la function SearchCustomer() che inizializza la stringa JSON da inviare all' HttpHandler, specificando il nome dello UserControl desiderato (CustomersGridView) ed i parametri richiesti (FilterExpression). Viene quindi invocata la funzione getData(...) che si occupa di gestire la comunicazione AJAX con l' HttpHandler. Infine, l' Html di rendering dello UserControl CustomersGridView viene posizionato all'interno del div "testDiv" della pagina. 

  

   

 

Technorati Tag: jQuery,AJAX,HttpHandler,JSON&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94994.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/21/caricamento-dinamico-di-usercontrol-via-jquery-ajax-e-httphandler.aspx</guid>
            <pubDate>Sun, 21 Dec 2008 20:57:48 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/21/caricamento-dinamico-di-usercontrol-via-jquery-ajax-e-httphandler.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94994.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94994.aspx</trackback:ping>
        </item>
        <item>
            <title>[ASP.NET AJAX] UpdatePanelPopupExtender</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/15/asp.net-ajax-updatepanelpopupextender.aspx</link>
            <description>Un controllo AJAX molto "cool": UpdatePanelPopupExtender. 

Si tratta di un ASP.NET AJAX extender che può essere agganciato ad un UpdatePanel in modo tale che quest'ultimo appaia dietro ad un qualsiasi controllo che specifichiamo come PopUp. 



In questo post vengono evidenziati alcuni interessanti scenari che si possono implementare con questo controllo:

    Master Details 
    Master Multiple Details 
    AJAX search 

Un grazie a Manuel per la segnalazione.
Technorati Tag: ASP.NET AJAX&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94946.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/15/asp.net-ajax-updatepanelpopupextender.aspx</guid>
            <pubDate>Mon, 15 Dec 2008 18:50:17 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/12/15/asp.net-ajax-updatepanelpopupextender.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94946.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94946.aspx</trackback:ping>
        </item>
        <item>
            <title>[ASP.NET AJAX] Modal Progress con jQuery</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/10/27/asp.net-ajax-modal-progress-con-jquery.aspx</link>
            <description>In questo post viene mostrato un utilizzo del jQuery BlockUI plugin per visualizzare un Modal Progress personalizzato durante il partial postback di un UpdatePanel. Il risultato che si può ottenere con questo approccio è ad esempio il seguente:



Molto interessante :)

Technorati Tag: AJAX,jQuery&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/94392.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/10/27/asp.net-ajax-modal-progress-con-jquery.aspx</guid>
            <pubDate>Mon, 27 Oct 2008 13:45:26 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/10/27/asp.net-ajax-modal-progress-con-jquery.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/94392.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/94392.aspx</trackback:ping>
        </item>
        <item>
            <title>[ASP.NET AJAX] Accesso sicuro al DOM</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2008/08/12/asp.net-ajax-accesso-sicuro-al-dom.aspx</link>
            <description>Un po' di tempo fa mi sono imbattutto in un post dell' IEBlog in cui viene mostrato come l'aggiunta "prematura" di elementi al DOM tramite javascript ( ovvero prima che il parser rilevi la corretta chiusura del tag padre dell'elemento aggiunto dinamicamente ) può indurre IE7 alla visualizzazione di un messageBox "Operation aborted" che preclude addirittura la visualizzazione della pagina. Viceversa, se il DOM viene acceduto "troppo tardi" - ad esempio per nascondere degli elementi della pagina come immagini o oggetti embedded - si possono ottenere degli effetti indesiderati di lampeggiamento ("flickers"). Dunque, sorge spesso il dubbio circa quando e come modifcare il DOM della pagina in base al browser per evitare inconsistenze/risultati non ottimali. Certamente la questione non è banale!     Anzitutto, modificare il DOM dopo che si è scatenato l'evento window.onload costituisce un'operazione sicura, ma talvolta ci troviamo di fronte all'esigenza di non poter attendere il completo caricamento della pagina (DOM + oggetti) in quanto può avvenire troppo tardi rispetto alle nostre esigenze: potremmo infatti desiderare che il nostro script venga eseguito subito dopo che il DOM viene parserizzato dal browser ma prima che le immagini vengano scaricate.     Prima di vedere come questo scenario sia gestito automaticamente (e in maniera cross-browser) dal framework client-side di ASP.NET AJAX, spendiamo un attimo due parole sull' attuale supporto fornito dai principali browser per la manipolazione client-side del DOM.  Firefox, Opera e Safari prevedono un evento DOMContentLoaded che viene scatenato subito dopo il caricamento del DOM ma immediatamente prima del download dei vari oggetti della pagina. Quindi, l'unica cosa da fare è aggiungere un EventListener per l'evento DOMContentLoaded e il gioco è fatto.          if (document.addEventListener)      {     document.addEventListener("DOMContentLoaded", function() {     // Codice che accede al DOM in maniera sicura...    }, false);       }  Internet Explorer (almeno fino alla versione 7) non rende la vita così semplice, in quanto l'evento DOMContentLoaded non è supportato. Siamo dunque costretti ad affidarci a qualche workaround che lo emuli. Nello specifico, i due workaround più conosciuti sono:     utilizzare l'attributo defer nel tag script:  &amp;lt;script type="text/javascript" defer="defer" src="onload.js" /&amp;gt;     implementare un meccanismo di controllo alternativo come questo per attendere il corretto caricamento del DOM.    In framework client-side di ASP.NET AJAX invece risolve il problema alla radice!     Anzitutto, per ovvi motivi non è prevista alcuna ottimizzazione dedicata ad un browser specifico (es. agganciamento dell'evento DOMContentLoaded a seguito dello sniffing del browser), tuttavia l'inizializzazione dei vari componenti viene sempre eseguita dopo il caricamento del DOM. Come avviene tutto questo? Vediamo.     Nel codice sorgente dell' AJAX Library viene definita una classe Sys.Application che viene istanziata automaticamente in ogni pagina:         Sys.Application = new Sys._Application(); Il costruttore _Application() al suo interno include il seguente codice:       Sys.UI.DomEvent.addHandler(window, "load", this._loadHandlerDelegate);       Sys.UI.DomEvent.addHandler(window, "unload", this._unloadHandlerDelegate);      La prima istruzione aggancia l'evento Application.load all'evento window.load del browser mentre la seconda istruzione associa l'evento Application.unload all'evento window.unload. Dunque, quando viene scatenato l'evento window.load viene invocato il metodo _loadHandlerDelegate() di ASP.NET AJAX, il quale a sua volta invoca il metodo _Application.initialize():     function Sys$_Application$initialize()      {        if(!this._initialized &amp;amp;&amp;amp; !this._initializing)         {          this._initializing = true;           window.setTimeout(Function.createDelegate(this, this._doInitialize), 0);           }      }      A cosa serve l'ultima istruzione window.setTimeout(...)? Da quanto ho avuto modo di apprendere, impostare l'invocazione di un metodo a seguito di un timeout di 0 millisecondi forza il browser ad eseguire la funzione prima possibile. In questo caso, si suppone che il metodo _doInitialize venga eseguito dopo che il DOM viene caricato ma prima che venga scaricato il contenuto binario di immagini, oggetti flash/silverlight etc. In questo modo il runtime di javascript non permette lo scadere del timeout e forza l'esecuzione di _doInitialize finché il DOM non sarà completamente caricato.   Di conseguenza il metodo _doInitialize verrà eseguito solo quando sarà sicuro modificare il DOM e nello stesso tempo ci preserverà dall'attesa della completa esecuzione dell' evento window.load (il quale - ricordiamolo ancora - attende il download degli oggetti binari nella pagina).         In conclusione, ASP.NET AJAX fornisce un proprio meccanismo analogo al DOMContentLoaded che permette il corretto accesso al DOM indipendentemente dal browser utilizzato. A questo punto la domanda finale è: dove viene posizionata la chiamata Sys.Application.initialize() ?  Lo ScriptManager si prenderà cura di posizionarla appena prima della chiusura del tag &amp;lt;/form&amp;gt; in fondo alla pagina, assumendo ovviamente che non ci siano altri script "a rischio" dopo di esso.      Technorati tags: AJAX, DOM&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/93690.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2008/08/12/asp.net-ajax-accesso-sicuro-al-dom.aspx</guid>
            <pubDate>Tue, 12 Aug 2008 15:31:44 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2008/08/12/asp.net-ajax-accesso-sicuro-al-dom.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/93690.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/93690.aspx</trackback:ping>
        </item>
        <item>
            <title>AjaxControlToolkit v1.0.10606: uno strano comportamento del ModalPopupExtender</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2007/06/13/81628.aspx</link>
            <description>Vorrei&amp;nbsp;segnalare uno strano comportamento della nuova versione del&amp;nbsp;ModalPopupExtender che ho avuto modo di&amp;nbsp;notare proprio oggi&amp;nbsp;nell' ultima release di AjaxControlToolkit.Supponiamo di avere il seguente scenario, in cui ci sono due ModalPopupExtender aventi TargetControlID diversi ma&amp;nbsp;lo stesso PopupControlID: ...
        &amp;lt;asp:Panel ID=&amp;quot;MyTestPanel&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
            My content...&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;
            &amp;lt;asp:Button ID=&amp;quot;OKButt&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot; OK &amp;quot; /&amp;gt;            
            &amp;lt;asp:LinkButton ID=&amp;quot;Close_LB&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Chiudi&amp;quot;&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;
        &amp;lt;/asp:Panel&amp;gt;
        &amp;lt;asp:LinkButton ID=&amp;quot;ShowPanel1_LB&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Show1&amp;quot;&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;
        &amp;lt;asp:LinkButton ID=&amp;quot;ShowPanel2_LB&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Show2&amp;quot;&amp;gt;&amp;lt;/asp:LinkButton&amp;gt;
                
         &amp;lt;ajax:ModalPopupExtender ID=&amp;quot;ModalPopupExtender1&amp;quot; runat=&amp;quot;server&amp;quot;
            TargetControlID=&amp;quot;ShowPanel1_LB&amp;quot;
            PopupControlID=&amp;quot;MyTestPanel&amp;quot; 
            OkControlID=&amp;quot;OKButt&amp;quot;
            CancelControlID=&amp;quot;Close_LB&amp;quot; 
            DropShadow=&amp;quot;true&amp;quot; /&amp;gt;     
            
         &amp;lt;ajax:ModalPopupExtender ID=&amp;quot;ModalPopupExtender2&amp;quot; runat=&amp;quot;server&amp;quot; 
            TargetControlID=&amp;quot;ShowPanel2_LB&amp;quot;
            PopupControlID=&amp;quot;MyTestPanel&amp;quot; 
            OkControlID=&amp;quot;OKButt&amp;quot;
            CancelControlID=&amp;quot;Close_LB&amp;quot; 
            DropShadow=&amp;quot;true&amp;quot; /&amp;gt;     
...Con la nuova versione del controllo, al momento del click su uno dei due TargetControlID viene scatenata dal framework client-side&amp;nbsp;la seguente eccezione:"Sys.InvalidOperationException: Two components with the same id&amp;nbsp;'&amp;lt;nomePanel&amp;gt;$DropShadowBehaviour' can't be added to the application."Come si può intuire&amp;nbsp;immediatamente, si tratta di un problema legato alla proprietà DropShadow del ModalPopupExtender. Infatti, se la si imposta a "false", automaticamente tutto torna a funzionare correttamente.Nei prossimi giorni dovrò cercare di trovare una spiegazione plausibile a questo problema, anche perché sono rimasto veramente&amp;nbsp;amareggiato dal fatto che nella release precedente questo scenario era&amp;nbsp;supportato e funzionante (come logicamente è normale che sia).&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/81628.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2007/06/13/81628.aspx</guid>
            <pubDate>Wed, 13 Jun 2007 18:01:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2007/06/13/81628.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/81628.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/81628.aspx</trackback:ping>
        </item>
        <item>
            <title>Forzare l'Update() di un UpdatePanel tramite un evento Javascript... una scelta corretta?</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2007/05/04/77266.aspx</link>
            <description>Oggi mi &amp;#232; stato chiesto a bruciapelo (cito testualmente) "...un modo per eseguire il refresh di un UpdatePanel tramite un evento javascript (ad esempio onblur di un input text)...".Se ci pensiamo bene, questo tipo di scelta implementativa va "filosoficamente" contro i principi di AJAX. Infatti (assumendo che il browser supporti Javascript :)), &amp;#232;&amp;nbsp;maggiormente corretto utilizzare il pi&amp;#249; possibile le API AJAX del framework client-side per gestire il comportamento dei controlli client-side, al fine di evitare round-trip dispendiosi e spesso inutili verso il server (uno degli obiettivi primari di AJAX, d'altronde, &amp;#232; proprio questo :)).Si pensi al caso di un' invocazione di un Web Service: gestirla direttamente tramite il framework lato client permette di risparmiare un round-trip!Potremmo discutere sulla questione all'infinito...;) Ad ogni modo, una soluzione veloce al problema potrebbe consistere nel forzare da Javascript il PostBack della pagina nei confronti di un controllo impostato come Trigger del nostro UpdatePanel. Come controllo potremmo usare ad esempio un HiddenField:
&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;"-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.0&amp;nbsp;Transitional//EN"&amp;nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&amp;lt;html&amp;nbsp;xmlns="http://www.w3.org/1999/xhtml"&amp;nbsp;&amp;gt;&amp;lt;head&amp;nbsp;runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;Test&amp;nbsp;UpdatePanel&amp;nbsp;'OnBlur'&amp;nbsp;su&amp;nbsp;Input&amp;nbsp;Text&amp;lt;/title&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;type="text/javascript"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;postBackHF(hiddenFieldID)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;hiddenField&amp;nbsp;=&amp;nbsp;$get(hiddenFieldID);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(hiddenField)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hiddenField.value&amp;nbsp;=&amp;nbsp;(new&amp;nbsp;Date()).getTime();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__doPostBack(hiddenFieldID,'');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form&amp;nbsp;id="form1"&amp;nbsp;runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;Test&amp;nbsp;UpdatePanel&amp;nbsp;'OnBlur'&amp;nbsp;su&amp;nbsp;Input&amp;nbsp;Text&amp;lt;/h1&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:ScriptManager&amp;nbsp;ID="TestScriptManager"&amp;nbsp;runat="server"&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:UpdatePanel&amp;nbsp;ID="UpdatePanelTest"&amp;nbsp;runat="server"&amp;nbsp;UpdateMode="Conditional"&amp;nbsp;ChildrenAsTriggers="False"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ContentTemplate&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;style="background-color:&amp;nbsp;#FFFF00;&amp;nbsp;padding:&amp;nbsp;10px;"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;UpdatePanel&amp;lt;/h2&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type="text"&amp;nbsp;id="testTB"&amp;nbsp;value="Scatena&amp;nbsp;l'OnBlur..."&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; onblur="postBackHF('&amp;lt;%=HiddenFieldTest.ClientID&amp;nbsp;%&amp;gt;')"&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:HiddenField&amp;nbsp;ID="HiddenFieldTest"&amp;nbsp;runat="server"&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:Label&amp;nbsp;ID="Outputlbl"&amp;nbsp;runat="server"&amp;nbsp;Text="Label"&amp;gt;&amp;lt;/asp:Label&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ContentTemplate&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Triggers&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;asp:AsyncPostBackTrigger&amp;nbsp;ControlID="HiddenFieldTest"&amp;nbsp;EventName="ValueChanged"&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Triggers&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/asp:UpdatePanel&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;E nel CodeFile......protected&amp;nbsp;void&amp;nbsp;Page_Load(object&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&amp;nbsp;{&amp;nbsp;&amp;nbsp; if(IsPostBack) &amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Outputlbl.Text&amp;nbsp;=&amp;nbsp;"UpdatePanel&amp;nbsp;Refreshed:&amp;nbsp;"&amp;nbsp;+&amp;nbsp;DateTime.Now.ToString();&amp;nbsp;&amp;nbsp; }&amp;nbsp;}...Come si pu&amp;#242; osservare, all'occorrenza dell' evento "onblur" della nostra textbox, andiamo a cambiare il valore lato client del nostro HiddenField di appoggio. Quindi, forziamo il __doPostBack() in modo da scatenarne, lato server, l'evento ValueChanged, ovvero il Trigger che invocher&amp;#224; automaticamente il metodo Update() del nostro UpdatePanel. In questo caso si &amp;#232; scelto di impostare l'evento ValueChanged dell' HiddenField come AsyncPostBackTrigger in quanto la propriet&amp;#224; ChildrenAsTriggers dell'UpdatePanel &amp;#232; impostata su "False". E' chiaro che si pu&amp;#242; pensare di implementare questo scenario in tanti altri modi diversi :)...&lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/77266.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2007/05/04/77266.aspx</guid>
            <pubDate>Fri, 04 May 2007 00:54:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2007/05/04/77266.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/77266.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/77266.aspx</trackback:ping>
        </item>
        <item>
            <title>Usare lo ScriptManager per determinare quale controllo run-time ha causato un evento in AsyncPostBack</title>
            <link>http://blogs.ugidotnet.org/dsantarelli/archive/2007/04/30/76920.aspx</link>
            <description>Spesso nelle nostre applicazioni ASP.NET ci troviamo di fronte all'esigenza di aggiungere controlli in fase di run-time in modo da&amp;nbsp;rendere completamente dinamico&amp;nbsp;il comportamento delle nostre&amp;nbsp;pagine.&amp;nbsp; Ultimamente mi sono scontrato con la necessit&amp;#224; di utilizzare questa tecnica all'interno del&amp;nbsp;controllo UpdatePanel di ASP.NET AJAX. Anzitutto,&amp;nbsp;&amp;#232; importante&amp;nbsp;precisare come non sia possibile aggiungere controlli direttamente nell'UpdatePanel (non possiamo quindi fare una cosa di questo tipo: MyUpdatePanel.Controls.Add(...)). Siamo quindi vincolati a prevedere dei container (es. Panel) da collocare nel ContentTemplateContainer dell' UpdatePanel&amp;nbsp;per procedere&amp;nbsp;all'aggiunta dei nostri controlli. Uno dei modi pi&amp;#249; veloci e funzionali&amp;nbsp;per poter poi riuscire a determinare quale controllo&amp;nbsp;run-time all'interno dell' UpdatePanel ha generato un evento&amp;nbsp;in modalit&amp;#224; AsyncPostBack,&amp;nbsp;sfrutta semplicemente l'oggetto Request della pagina relativamente allo ScriptManager dichiarato.Andando in ordine, questa &amp;#232; una pagina di esempio:&amp;lt;!DOCTYPE&amp;nbsp;html&amp;nbsp;PUBLIC&amp;nbsp;"-//W3C//DTD&amp;nbsp;XHTML&amp;nbsp;1.1//EN"&amp;nbsp;"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&amp;gt;&amp;lt;html&amp;nbsp;xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&amp;lt;head&amp;nbsp;runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;UpdatePanel&amp;nbsp;con&amp;nbsp;controlli&amp;nbsp;Run-Time&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;UpdatePanel&amp;nbsp;con&amp;nbsp;controlli&amp;nbsp;Run-Time&amp;lt;/h1&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form&amp;nbsp;id="form1"&amp;nbsp;runat="server"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;?xml:namespace prefix = asp /&gt;&lt;&gt;ID="MyScriptManager"&amp;nbsp;runat="server"&amp;nbsp;EnablePartialRendering="true"&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;&gt;ID="MyUpdatePanel"&amp;nbsp;runat="server"&amp;nbsp;UpdateMode="Conditional" RenderMode="Block"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;&gt;ID="StatusLbl"&amp;nbsp;runat="server"&amp;gt;&amp;lt;/asp:Label&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;&gt;ID="ControlsPanel1"&amp;nbsp;runat="server"&amp;gt;&amp;lt;/asp:Panel&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br&amp;nbsp;/&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;&gt;ID="ControlsPanel2"&amp;nbsp;runat="server"&amp;gt;&amp;lt;/asp:Panel&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ContentTemplate&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/asp:UpdatePanel&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;E questo &amp;#232; il relativo CodeFile.&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected&amp;nbsp;void&amp;nbsp;Page_Load(object&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AddMyControls(); //&amp;nbsp;Aggiunta dei controlli alla Pagina&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(MyScriptManager.IsInAsyncPostBack)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string MyScriptManagerRequest = Request[MyScriptManager.ID];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;Visualizziamo il contenuto della richiesta dello ScriptManager&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StatusLbl.Text&amp;nbsp;=&amp;nbsp;MyScriptManagerRequest ;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(MyScriptManagerRequest.Contains("Button1"))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Fai&amp;nbsp;qualcosa...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(MyScriptManagerRequest.Contains("Button2"))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Fai&amp;nbsp;qualcosa...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;private&amp;nbsp;void&amp;nbsp;AddMyControls()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;Button&amp;nbsp;button1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Button();&amp;nbsp;&amp;nbsp;&amp;nbsp;button1.ID&amp;nbsp;=&amp;nbsp;"Button1";&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&amp;nbsp;&amp;nbsp;Button&amp;nbsp;button2&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Button();&amp;nbsp;&amp;nbsp;&amp;nbsp;button2.ID&amp;nbsp;=&amp;nbsp;"Button2";&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&amp;nbsp;&amp;nbsp;ControlsPanel1.Controls.Add(button1);&amp;nbsp;&amp;nbsp;&amp;nbsp;ControlsPanel2.Controls.Add(button2);&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...Occorre&amp;nbsp;porre attenzione al&amp;nbsp;fatto che il contenuto di Request[MyScriptManager.ID] , ovvero la stringa&amp;nbsp;nel POST Http&amp;nbsp;corrispondente al&amp;nbsp;nostro ScriptManager (MyScriptManager),&amp;nbsp;contiene qualcosa del tipo "&amp;lt;ID UpdatePanel&amp;gt;|&amp;lt;ID Controllo&amp;gt;" (nel nostro caso ad esempio&amp;nbsp;"MyUpdatePanel|Button1"). Possiamo quindi&amp;nbsp;processare questa stringa per capire quale controllo ha causato il PostBack asincrono e quindi procedere con la nostra logica di business. &lt;img src="http://blogs.ugidotnet.org/dsantarelli/aggbug/76920.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Dario Santarelli</dc:creator>
            <guid>http://blogs.ugidotnet.org/dsantarelli/archive/2007/04/30/76920.aspx</guid>
            <pubDate>Mon, 30 Apr 2007 00:55:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/dsantarelli/archive/2007/04/30/76920.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/dsantarelli/comments/commentRss/76920.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/dsantarelli/services/trackbacks/76920.aspx</trackback:ping>
        </item>
    </channel>
</rss>