代码之家  ›  专栏  ›  技术社区  ›  Voice

如何获取发起回发的Updatepanel的id

  •  7
  • Voice  · 技术社区  · 14 年前

    嗨,我需要在udate panel async post back之后拦截服务器回调,并确定是哪个面板发起了请求。代码非常简单:

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

    当UpdatePanel不在另一个UpdatePanel中时,它就工作了。但是当它在另一个UpdatePanel updatedPanels[idx]中时,id具有父UpdatePanel id。那么如何获取发起请求的UpdatePanel的id(内部UpdatePanel)?桑克斯

    3 回复  |  直到 14 年前
        1
  •  3
  •   MK.    14 年前

    干得好:

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

    更新:

    <%@ 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
  •  0
  •   scherand    14 年前

    我来猜猜这个。

    是否设置 UpdateMode = Conditional 在外部(或两者) UpdatePanel 有人帮忙吗?我认为问题是,你只得到“最外层”的更新面板,如果你不设置 UpdateMode Conditional 外部面板也会更新(即使您单击内部面板中的某些内容;参见第二个参考文件)。

    参考请参见

    UpdateMode=条件 UpdatePanel1(父级),两个标签

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

    每次发回都会更新 面板内部,其他面板内部

    Remember to set UpdatePanel's UpdateMode to Conditional

        3
  •  0
  •   Voice    14 年前