Как получить идентификатор Updatepanel, который инициировал обратную передачу - PullRequest
7 голосов
/ 25 мая 2010

Привет! Мне нужно перехватить обратный вызов сервера после асинхронной отправки панели udate и определить, какая панель инициировала запрос. Код довольно прост:

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. Итак, как я могу получить идентификатор UpdatePanel, который инициировал запрос (внутренний UpdatePanel)? Thanx

Ответы [ 3 ]

2 голосов
/ 25 мая 2010

Вот, пожалуйста,

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>
0 голосов
/ 26 мая 2010

Наконец-то я пришел к решению: проблема заключалась в том, что у меня был элемент управления триггером (Button) для дочерней UpdatePanel, который фактически находился вне этой панели обновлений и внутри родительской UpdatePanel (извините, я этого не заметил). Если вы поместите Button внутри дочерней UpdatePanel - все работает нормально.

0 голосов
/ 25 мая 2010

У меня будет догадка на этот раз.

Помогает ли настройка UpdateMode = Conditional на внешней (или обеих) UpdatePanel s? Я думаю, что проблема в том, что вы получаете только «самую внешнюю» обновленную панель, и если вы не установите UpdateMode в Conditional, внешняя панель также будет обновлена ​​(даже если вы нажмете что-то на внутренней панели; см. Вторую ссылку) .

Для справки см.

Обратите внимание, что если я удалю свойство UpdateMode = Условно для UpdatePanel1 (родитель), обе метки обновится.

из Панель обновления расширений ASP.NET 2.0 AJAX - вложенная панель обновления

и

Когда установлено Всегда, UpdatePanel обновляется на каждый постбэк, поднятый с в любом месте страницы, так что из элементов управления внутри панели, внутри других панелей или просто на странице.

из Не забудьте установить для UpdatePanel UpdateMode значение Conditional

...