2010-05-25 12 views
7

Ciao Devo intercettare il callback del server dopo il post async del pannello udate e determinare quale pannello ha avviato la richiesta. Il codice è piuttosto semplice:Come ottenere l'id di Updatepanel che ha avviato un postback

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; 
     } 
     } 
} 

E funziona quando UpdatePanel non si trova all'interno di un altro UpdatePanel. Ma quando è all'interno di un altro UpdatePanel updatedPanels [idx] .id ha l'id dell'ID Updatepanel. Quindi, come posso ottenere l'id di UpdatePanel che ha avviato la richiesta (l'UpdatePanel interno)? Grazie

risposta

2

Qui si va:

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

Aggiornamento:

<%@ 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

Dubito che funzioni poiché _postBackSettings è una proprietà interna, quindi non è possibile chiamarlo direttamente dal codice. – Voice

+0

questo è javascript !! e ti darà l'id del pannello di aggiornamento e l'id dell'elemento di attivazione come questo "UpdatePanel1 | Button1". Hai provato?! –

+0

Sì, ho provato e si è verificato un errore poiché sender._postBackSettings non è disponibile – Voice

0

Avrò un'ipotesi su questo.

L'impostazione UpdateMode = Conditional sulla guida esterna (o su entrambi) UpdatePanel s? Penso che il problema è che si ottiene solo il pannello aggiornato "più esterno" e se non si imposta UpdateMode su Conditional viene aggiornato anche il Pannello esterno (anche se si fa clic su qualcosa nel pannello interno, vedere il secondo riferimento).

Per riferimento vedere

Si noti che, se tolgo la proprietà UpdateMode = condizionale per il UpdatePanel1 (genitore), sia le etichette otterrà rinfrescato.

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

e

Quando è impostato su Sempre, l'UpdatePanel è aggiornati su ogni postback risuscitato dai qualsiasi punto della pagina, in modo da controlli all'interno del pannello, all'interno di altri pannelli o solo sulla pagina.

da Remember to set UpdatePanel's UpdateMode to Conditional

0

Finalmente mi è venuto a soluzione: il problema era che non avevo il controllo di innesco (Button) per UpdatePanel figlio che in realtà era al di fuori del pannello di aggiornamento e all'interno del genitore UpdatePanel (scusate non l'avevo notato). Se si inserisce Button in Child UpdatePanel, tutto funziona correttamente.

+0

Ciò non aiuta nella mia situazione, in cui ho bisogno del controllo del trigger all'esterno dei pannelli di aggiornamento e registrato come trigger asincrono tramite ScriptManager. In tal caso 'sender._postBackSettings.panelID' contiene gli ID del trigger e il _script manager_, non i pannelli di aggiornamento. –

Problemi correlati