How to get the Updatepanel ID that initiated the postback

Hey. I need to intercept the server callback after the aync message of the hit panel and determine which panel initiated the request. The code is pretty simple:

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

And it works when the UpdatePanel is not inside another UpdatePanel. But when it is inside another UpdatePanel updatedPanels [idx] .id has the parent id of Updatepanel. So, how can I get the identifier of the UpdatePanel that initiated the request (internal UpdatePanel)? Thanx

+7
asp.net-ajax updatepanel
source share
3 answers

Here you go:

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

Update:

 <%@ 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> 
+2
source share

I will have to guess about it.

Does setting UpdateMode = Conditional in external (or both) UpdatePanel help? I think the problem is that you get only the โ€œmost remoteโ€ updated panel, and if you do not install UpdateMode in Conditional , the external panel is also updated (even if you click something on the internal panel, see the second link).

For reference see

Please note that if I remove the UpdateMode = property conditionally for UpdatePanel1 (parent), both shortcuts will be updated.

from AJAX Update Panel for ASP.NET 2.0 Extension - Nested Update Panel

and

If set to Always, the UpdatePanel is updated every time it returns anywhere on the page, therefore from controls inside the panel, inside other panels, or simply on the page.

from Remember to set UpdatePanel UpdateMode to Conditional

0
source share

Finally, I came to a solution: the problem was that I had a trigger control (Button) for the child UpdatePanel, which was actually outside of this update panel and inside the parent UpdatePanel (sorry I did not notice this). If you click the Button inside the child UpdatePanel, everything will be fine.

0
source share

All Articles