UpdatePanel e trigger su evento JavaScript - JSAsyncPostBackTrigger

by Andrea 26 March 2007 13:03

Come accennavo nel post precedente, a volte capita di voler aggiornare il contenuto di un UpdatePanel tramite un evento JavaScript. Il non poter fare questa cosa un pò mi rodeva, e allora ho cercato una soluzione e, applicando alcuni workaround, sono riuscito a creare un tipo di trigger per l'UpdatePanel che fa scatenare l'update agganciandosi ad un preciso evento JavaScript.

Come usarlo:
Questo trigger va aggiunto alla collezione dei trigger come lo si fa per i due tipi di trigger esistenti (AsyncPostBackTrigger, PostBackTrigger ):

[...]
    </ContentTemplate>
     <Triggers>
         <asp:JSAsyncPostBackTrigger
                 ControlID="txtText"
                 EventName="keyup"
                 ClientFunction="validation" />
         <asp:JSAsyncPostBackTrigger
                 ControlID="txtText"
                 EventName="change" />
     </Triggers>
 </asp:UpdatePanel>
Nel trigger vanno specificati, l'ID del controllo (ControlID) che scatena l'evento, il nome dell'evento JavaScript (EventName) che farà scatenare l'Update, e facoltativamente, il nome di una funzione JavaScript per la validazione (ClientFunction) che ho visto che spesso può tornare utile. Quest'ultima può valutare se far scatenare o no il trigger, e per fare ciò è sufficiente impostare un flag (args.IsValid) a true per fare scatenare l'update, o a false per annullare il trigger. Questa funzione può essere usata anche per eseguire del codice JavaScript prima dell'update del UpdatePanel. 
Eccone un esempio:
function validation(args) {
    if (($get('txtText').value.length % 3) == 0)
    {
        args.IsValid = true;
    }
    else
     {
        args.IsValid = false;
    }
}

Per poter usare il tutto, si deve referenziare la dll ed il trigger va registrato nella pagina nel seguente modo:
<%@ Register Assembly="XeDotNet.Dottor.Web.UI" Namespace="XeDotNet.Dottor.Web.UI" TagPrefix="asp" %>
oppure nel Web.Cofig all'interno del blocco pages:
<add Register Assembly="XeDotNet.Dottor.Web.UI" Namespace="XeDotNet.Dottor.Web.UI" TagPrefix="asp" />

Problemi conosciuti:
Questo tipo di trigger è ancora allo stato embrionale, infatti al momento ha il difetto di non poter venire aggiunto dinamicamente durante un PostBack, ma conto di risolvere questo punto al più presto. (UPDATE del 27.03.2007 - problema risolto) Attenzione a quali eventi agganciate al trigger per evitare un numero tropppo elevato di PostBack.

Compatibilità:
Il trigger dovrebbe essere cross-browser in quanto fa uso della ASP .NET AJAX library (che è cross-browser).

Download:
(ultimo aggiornamento dei file in download: 30.03.2007) Ecco il link per il download della dll ed ecco il link con il download del codice sorgente ed un esempio d'uso.

Feedback:
Vi chiedo solamente di lasciare un vostro commento/impressione per avere alcuni feedback e sapere se approfondire il trigger in questione (e se può servire realmente a qualcuno all'infuori di me).

Thanks smile_wink

Technorati tags: , , ,

Tags:

ASP.NET AJAX

Comments

31/03/2007 03:03 #

ASP.NET AJAX: Un tipo con i triggers

di .NET e di altre Amenità |

31/03/2007 11:03 #

Questo script funziona correttamente sia con Ie che con FF. Testato! Mi ha risolto un bel problema: l'aggiornamento di un UpdatePanel all'evento click di un checkbox su un TreeView.
Grazie mille.
          

Massimo |

01/04/2007 18:03 #

Ho scoperto che se uso una masterpage ed ho del codice tipo  il trigger va in errore:

HttpException was unhandled user code

The Controls collection cannot be modified because the control contains code blocks (i.e. ).
          

Maurizio |

02/04/2007 09:03 #

Ciao, ho aggiornato il codice del trigger, ma per alcune sviste che mi sono accorto.

Il tuo problema è dovuto alla presenza dei codeblocks nella pagina, e questo non è un problema da poco. Dovresti provare a toglierli...

Ti giro alcuni link che presentano alcuni workaround per il problema in questione:
www.aspnetresources.com/.../..._cause_trouble.aspx
http://west-wind.com/weblog/posts/5758.aspx
http://west-wind.com/WebLog/posts/6148.aspx
          

Andrea |

12/01/2008 03:01 #

ottimo esempio, molto utile, grazie

davide |

Comments are closed