Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Rafraichir un Updatepanel manuellement

Les UpdatePanels sont des contrôles Microsoft Ajax Extensions (Atlas) qui permettent de rafraichir une partie de la page sans postback grâce à une requête Ajax, ce nouveau postback est aussi connu sous le nom de AsyncPostBack. Pour avoir un rafraichissement partiel il faut définir dans notre page aspx quels sont les contrôles et événement qui vont rafraichir cet UpdatePanel cet action se fait via un système de triggers, par défaut tous les contrôles à l'intérieur de l'UpdatePanel déclenche un AsyncPostBack.

Pour ceux qui ne connaissent pas, voici un exemple tout simpliste qui illustre ce concept :

<asp:updatePanel id="UP1" runat="server"> <ContentTemplate> La zone à rafraichir : <%=DateTime.Now.ToLongTimeString() %> <asp:Button id="Button1" runat="server" text="Rafraichir !" /> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger eventName="Click" controlID="Button2" /> </Triggers> </asp:updatePanel> <asp:Button ID="Button2" runat="server" Text="Rafraichir depuis l'exterieur" />

Mais comment faire si l'on veut rafraichir notre UpdatePanel manuellement via du code JavaScript ? Pour l'instant il nous faut obligatoirement un contrôle côté serveur, mais si l'on veut rafraichir un UpdatePanel suite à une action côté client, comment fait-on ? La réponse est simple : l'UpdatePanel n'est pas prévu pour ça, c'est "By Design". Mais ce n'est pas parce que ce n'est pas prévu qu'on ne peut pas le faire ;-)

Au début je voulais une façon propre puis je me suis vite rendu compte que ça allait vite devenir compliqué lourd et inutile donc voici une astuce très simple qui vous permettra de rafraichir un UdpatePanel à la mano. Il suffit de rajouter un LinkButton dans la page de mettre un trigger sur celui ci et d'appeler "à la main" la méthode click du lien :-)

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %> <script type="text/C#" runat="server"> protected void Page_Load(Object sender, EventArgs e) { Page.ClientScript.RegisterStartupScript(typeof(UpdatePanel), "ManualTrigger", String.Format(@" $addHandler(window, 'load', function(){{ while(window.prompt('dites oui !') != 'oui'); $get('{0}').click(); // C'est cette ligne qui permet de lancer l'asyncpostback à la mano }}); ", ManualUpdatePanel1Trigger.ClientID), true); } </script> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> <ContentTemplate> <%=DateTime.Now.ToLongTimeString() %> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger EventName="Click" ControlID="ManualUpdatePanel1Trigger" /> </Triggers> </asp:UpdatePanel> <asp:LinkButton ID="ManualUpdatePanel1Trigger" runat="server" Style="display: none;">Manuel trigger</asp:LinkButton> </form> </body> </html>
Posted: dimanche 10 décembre 2006 01:53 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

sebeuh a dit :

Salut Cyril,

Je viens (seulement !) de lire ce post concernant la mise à jour d'un UpdatePanel !

Excuse moi si je parais con mais je ne comprends pas la phrase "une astuce très simple qui vous permettra de rafraichir un UdpatePanel à la mano" ! Simple ??? On ne doit pas avoir la même perception de ce mot :p

Pourquoi ne déclares-tu pas ton contrôle "ManualUpdatePanel1Trigger" comme controle AsyncPostBack !

Dans ton page_load :

ScriptManager1.RegisterAsyncPostBackControl(ManualUpdatePanel1Trigger);

Puis sur l'event click de ton linkbutton :

UpdatePanel1.Update();

Au final le code :

protected void Page_Load(object sender, EventArgs e)

{

  ScriptManager1.RegisterAsyncPostBackControl(ManualUpdatePanel1Trigger);

}

protected void ManualUpdatePanel1Trigger_Click(object sender, EventArgs e)

{

  UpdatePanel1.Update();

}

Ca pour moi c'est "simple" :)

A bon entendeur

SeBeuH

# décembre 19, 2006 17:50

sebeuh a dit :

Quoique ton astuce peut etre utile dans certaine situation ;) Merci pr l'info qd meme ^^

Et désolé pour le spam/troll :)

# décembre 19, 2006 18:06

bianca a dit :

Comment peut-on différencier le postback de l'update panel d'un postback classique ?

# janvier 19, 2007 15:16

cyril a dit :

Tu peux utiliser la propriété isInAsyncPostback du scriptmanager, et tu as aussi la propriété isInPartialRendering d'un updatepanel, mais celle ci est buggé (c'est qu'un bug de plus :))

# janvier 19, 2007 15:52

Chubyone a dit :

Bonjour,

je me permets de poster tardivement ici,afin de faire part de ma petite expérience sur les problèmes de raffraichissement manuel d'un UpdatePanel...

J'avais trouvé l'astuce simplette (j'aurais aimé plus propre) d'un Button caché sur lequel on simule un click de souris dans une fonction javascript :

document.getElementById('Button2').click();

Ce Button étant dans un updatePanel, paf pif poum, cool ca marche, UpdatePanel refresh...

Sous Opera et Internet Explorer...

FireFox lui, m'embete... Il me reload la page... :( le vilain...

Très embetant... Car j'ai un swf en dehors de l'UpdatePanel, qui se recharge lui aussi...

Après quelques moults recherches je suis tombé la dessus :

http://jeffzon.net/Blog/post/Refresh-the-UpdatePanel-using-JavaScript-code.aspx

Avec la réponse à mon problème firefox : pour simuler un click sur le Button il faut :

var button = document.getElementById("Button2");

if ( !navigator.appName.indexOf("Microsoft") )

{

   // IE

   button.click();

}

else

{

   // FireFox

   var e = document.createEvent("MouseEvents");

   e.initEvent("click", true, true);

   button.dispatchEvent(e);

}

L'auteur n'est pas très satisfait de cette façon et nous propose une seconde méthode :

un très simple...

__doPostBack("Button2", "");

... dans la fonction javascript.

(J'ai taillé dans le tas par rapport à son exemple pour mon test...)

Me voici enfin avec un code qui fonctionne sous les 3 principaux Navig (pas testé les autres)

# mai 11, 2007 17:23
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- VMMap en mode instrumentation sur système 64bit : attention à la plateforme cible du build .NET par CoqBlog le il y a 6 heures et 17 minutes

- Etendre le Team Web Access de TFS 2012 – Step 0 par Philippe Didiergeorges Aka Philess le 05-23-2013, 23:48

- Simuler facilement l’envoi de mail par Blog de Jérémy Jeanson le 05-22-2013, 12:52

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29