Вложенная панель обновления: почему ChildrenAsTriggers не имеет никакого эффекта?

#c# #asp.net #ajax #updatepanel #nested

#c# #asp.net #ajax #панель обновления #вложенный

Вопрос:

Приведен простой пример с двумя вложенными панелями обновления. Они вложены, и у каждого есть метка, которая заполнена текущим временем в коде позади. Я не понимаю, почему ChildrenAsTriggers="true" — Свойство на внешней панели обновления не имеет никакого эффекта? Когда я нажимаю кнопку «Обновить вложенную панель», время в родительской панели обновления не обновляется. Но, насколько я понимаю свойство, оно должно быть:

 <asp:ScriptManager ID="ScriptManager1" runat="server" 
    onasyncpostbackerror="ScriptManager1_AsyncPostBackError">
</asp:ScriptManager>

<asp:Button ID="ButtonUpdate" runat="server" Text="Update Panel 1"
    style="margin-top: 15px" onclick="ButtonUpdate_Click" />
<asp:Button ID="ButtonUpdateNestedPanel" runat="server" Text="Update Nested Panel"
    style="margin-top: 15px" onclick="ButtonUpdateNestedPanel_Click" />

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="ButtonUpdate" EventName="Click" />
    </Triggers>
    <ContentTemplate>
        <asp:Label ID="Label1" runat="server" />

        <asp:UpdatePanel ID="UpdatePanelNested" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ButtonUpdateNestedPanel" EventName="Click" />
            </Triggers>
            <ContentTemplate>
                <asp:Label ID="LabelNested" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>

    </ContentTemplate>
</asp:UpdatePanel>
  

Спасибо за любые подсказки!
sl3dg3

p.s.: код, лежащий в основе:

 protected void ButtonUpdate_Click(object sender, EventArgs e)
{
    LabelNested.Text = DateTime.Now.ToString();
    Label1.Text = DateTime.Now.ToString();
}
protected void ButtonUpdateNestedPanel_Click(object sender, EventArgs e)
{
    LabelNested.Text = DateTime.Now.ToString();
    Label1.Text = DateTime.Now.ToString();
}
  

Ответ №1:

Когда свойству ChildrenAsTriggers присвоено значение true, а любой дочерний элемент управления UpdatePanel вызывает обратную отправку. Дочерние элементы управления вложенных элементов управления UpdatePanel не вызывают обновления внешнего элемента управления UpdatePanel, если они явно не определены как триггеры для родительской панели. http://forums.asp.net/t/1422425.aspx/1

и это должно быть похоже…

 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="ButtonUpdate" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="ButtonUpdateNestedPanel" EventName="Click" />
        </Triggers>
......   
......
  

Комментарии:

1. хм, но опять же я мог бы не учитывать ChildrenAsTriggers — это будет обновляться в любом случае… Я просто не могу уловить смысл этого свойства.

Ответ №2:

Я считаю, что для того, чтобы увидеть желаемый эффект в действии, вам действительно следует добавить свои кнопки в качестве дочерних элементов в шаблон содержимого. Свойство «ChildrenAsTriggers» применяется только к прямым дочерним элементам блока «ContentTemplate».

Ответ №3:

ChildrenAsTriggers=»true» Установите для свойства ChildrenAsTriggers значение true, если вы хотите, чтобы обратная передача от непосредственных дочерних элементов управления элемента управления UpdatePanel вызывала обновление содержимого панели. Дочерние элементы управления вложенных элементов управления UpdatePanel не вызовут обновления содержимого родительского элемента управления UpdatePanel, если вы явно не вызовете метод Update или не определите дочерние элементы управления как триггеры.