2010-05-25 5 views
7

Salut J'ai besoin d'intercepter le rappel du serveur après la publication asynchrone du panneau udate et de déterminer quel panneau a lancé la requête. Le code est assez simple:Comment obtenir l'ID de Updatepanel qui a initié une publication

Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(InterceptUpdateCallback); 

function InterceptUpdateCallback(sender, args) 
{ 
    var updatedPanels = args.get_panelsUpdated();  
    for (idx = 0; idx < updatedPanels.length; idx++) { 
     if (updatedPanels[idx].id == "myUpdatePanel") {    
      StartSmth(); 
      break; 
     } 
     } 
} 

Et cela fonctionne lorsque UpdatePanel ne se trouve pas dans un autre UpdatePanel. Mais quand il est dans un autre UpdatePanel updatedPanels [idx] .id a l'ID Updatepanel parent. Alors, comment puis-je obtenir l'ID de UpdatePanel qui a lancé la requête (le UpdatePanel interne)? Thanx

Répondre

2

Ici, vous allez:

function InterceptUpdateCallback(sender, args) { 
if (sender._postBackSettings) 
    alert(sender._postBackSettings.panelID); 
else 
    alert('first load');  
} 

Mise à jour:

<%@ Page Language="C#" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 
    protected void LinkButtons_Click(object sender, EventArgs e) 
    { 
     LabelMain.Text = LabelSub1.Text = LabelSub2.Text = LabelSub3.Text = string.Format("{0} Updated By {1}", DateTime.Now, ((Control)sender).ID); 
    } 
</script> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <style type="text/css"> 
     body { font-family: Tahoma;} 
     fieldset { padding: 15px; } 
     fieldset a 
     { 
      float: right; 
      clear: none; 
      display: block; 
      margin: 10px; 
     } 
     fieldset span 
     { 
      display: block; 
      margin-top: 20px; 
      margin-bottom: 20px; 
     } 
    </style> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <script type="text/javascript"> 
     function pageLoaded(sender, args) { 
      if (sender._postBackSettings) { 
       var panelId = sender._postBackSettings.panelID.split('|')[0]; 
       if (panelId == sender._scriptManagerID) { 
        var updatedPanels = args.get_panelsUpdated(); 
        var affectedPanels = "Affected Panels:\n"; 
        for(var x=0;x<updatedPanels.length;x++) 
         affectedPanels+= updatedPanels[x].id + "\n"; 
        alert("Request initiated by ScriptManager\n\nMight be an async trigger, or child of an update panel with children as triggers set to false.\n\n"+affectedPanels); 
       } 
       else 
        alert("Request initiated by: " + panelId); 
      } 
     } 
     Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoaded); 
    </script> 

    <asp:LinkButton ID="UpdateMain" runat="server" Text="UpdateMain" OnClick="LinkButtons_Click"></asp:LinkButton>, 
    <asp:LinkButton ID="UpdateSub1" runat="server" Text="UpdateSub1" OnClick="LinkButtons_Click"></asp:LinkButton>, 
    <asp:LinkButton ID="UpdateSub2" runat="server" Text="UpdateSub2" OnClick="LinkButtons_Click"></asp:LinkButton>, 
    <asp:LinkButton ID="UpdateSub3" runat="server" Text="UpdateSub3" OnClick="LinkButtons_Click"></asp:LinkButton> 
    <br /> 
    <br /> 
    <asp:UpdatePanel ID="Main" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <fieldset> 
       <asp:LinkButton ID="LinkButton1" runat="server" Text="LinkButton1" OnClick="LinkButtons_Click"></asp:LinkButton> 
       <legend>Main - Update Mode:Conditional, Children As Triggers:False</legend> 
       <asp:Label ID="LabelMain" runat="server" Text="LabelMain"></asp:Label> 
       <asp:UpdatePanel ID="Sub1" runat="server" UpdateMode="Always" ChildrenAsTriggers="true"> 
        <ContentTemplate> 
         <fieldset> 
          <asp:LinkButton ID="LinkButton2" runat="server" Text="LinkButton2" OnClick="LinkButtons_Click"></asp:LinkButton> 
          <legend>Sub1 - Update Mode:Always, Children As Triggers:True</legend> 
          <asp:Label ID="LabelSub1" runat="server" Text="LabelSub1"></asp:Label> 
          <asp:UpdatePanel ID="Sub2" runat="server" UpdateMode="Always" ChildrenAsTriggers="true"> 
           <ContentTemplate> 
            <fieldset> 
             <asp:LinkButton ID="LinkButton3" runat="server" Text="LinkButton3" OnClick="LinkButtons_Click"></asp:LinkButton> 
             <legend>Sub2 - Update Mode:Always, Children As Triggers:True</legend> 
             <asp:Label ID="LabelSub2" runat="server" Text="LabelSub2"></asp:Label> 
            </fieldset> 
           </ContentTemplate> 
           <Triggers> 
            <asp:AsyncPostBackTrigger ControlID="UpdateSub2" /> 
           </Triggers> 
          </asp:UpdatePanel>        
         </fieldset>       
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="UpdateSub1" /> 
        </Triggers> 
       </asp:UpdatePanel> 
       <asp:UpdatePanel ID="Sub3" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
        <ContentTemplate> 

         <fieldset> 
          <asp:LinkButton ID="LinkButton4" runat="server" Text="LinkButton4" OnClick="LinkButtons_Click"></asp:LinkButton> 
          <legend>Sub3 - Update Mode:Conditional, Children As Triggers:False</legend> 
          <asp:Label ID="LabelSub3" runat="server" Text="LabelSub3"></asp:Label> 
         </fieldset>       
        </ContentTemplate> 
        <Triggers> 
         <asp:AsyncPostBackTrigger ControlID="UpdateSub3" /> 
        </Triggers> 
       </asp:UpdatePanel> 
      </fieldset> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="UpdateMain" /> 
     </Triggers> 
    </asp:UpdatePanel> 
    </form> 
</body> 
</html> 
+0

Je doute que cela fonctionnera puisque _postBackSettings est une propriété interne de sorte que vous ne pouvez pas l'appeler directement à partir de votre code. – Voice

+0

c'est javascript !! et il vous donnera l'identifiant du panneau de mise à jour et l'identifiant de l'élément de déclenchement comme ceci "UpdatePanel1 | Button1". L'avez-vous essayé?! –

+0

Oui j'ai essayé et l'erreur se produit puisque sender._postBackSettings n'est pas disponible – Voice

0

Je vais deviner à celui-ci.

Le réglage UpdateMode = Conditional sur l'extérieur (ou les deux) UpdatePanel s aide-t-il? Je pense que le problème est que vous n'obtenez que le panneau mis à jour le plus externe et si vous ne réglez pas UpdateMode sur Conditional, le panneau externe est également mis à jour (même si vous cliquez quelque chose dans le panneau interne, voir la deuxième référence).

Pour voir référence

Notez que, si je retire la propriété UpdateMode = conditionnel pour la UpdatePanel1 (parent), les deux étiquettes est remise à.

de ASP.NET 2.0 AJAX Extensions Update Panel - Nested Update Panel

et

Lorsqu'il est réglé sur Toujours, l'UpdatePanel est mis à jour à chaque postback élevé de partout dans la page, des contrôles à l'intérieur du panneau, à l'intérieur d'autres panneaux ou juste sur la page.

de Remember to set UpdatePanel's UpdateMode to Conditional

0

Enfin, je suis venu à la solution: le problème était que je contrôlais de déclenchement (Bouton) pour UpdatePanel enfant qui était en fait en dehors de ce panneau de mise à jour et à l'intérieur parent UpdatePanel (désolé je n'avais pas remarqué cela). Si vous mettez Button à l'intérieur de UpdatePanel enfant - tout fonctionne bien.

+0

Cela n'aide pas dans ma situation, où j'ai besoin du contrôle de déclenchement en dehors des panneaux de mise à jour, et enregistré en tant que déclencheur asynchrone à travers le ScriptManager. Dans ce cas 'expéditeur._postBackSettings.panelID' contient les identifiants du trigger et du _script manager_, pas les panneaux de mise à jour. –

Questions connexes