将页面上的任何按钮作为 asp.net UpdatePanel 的触发器,而不是其同级或子回发控件

Make any button on the page as a trigger for an asp.net UpdatePanel other than its sibling or child postback controls

考虑以下代码片段:

<div>
    <asp:Button runat="server" ID="trickyUPTrigger" Text="Tricky Update" />
    <div>
        <asp:Button runat="server" ID="normalUPTrigger" OnClick="normalUPTrigger_Click" Text="Normal Update" />
        <asp:UpdatePanel runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="normalUPTrigger" />
            </Triggers>
            <ContentTemplate>
                <asp:Label runat="server" ID="changeableLabel" Text="Change me"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
</div>

现在将 ID 为 trickyUPTrigger 的按钮 作为 UpdatePanel 的触发器。或者,设计一种机制(可能...使用 javascript?)以便在单击此按钮时 UpdatePanel 更新而无需整页回发。

如果您想在单击 trickyUPTrigger 时更新 UpdatePanel,您可以将该按钮添加到触发器列表中:

<asp:UpdatePanel runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="normalUPTrigger" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="trickyUPTrigger" EventName="Click" />
    </Triggers>
    <ContentTemplate>
    ...
    </ContentTemplate>
</asp:UpdatePanel>


更新

您问了一些代码示例,这些示例显示了命名容器的情况,命名容器是一个概念,适用于具有项目模板的数据绑定控件,如 GridView 和 ListView,以及用户控件。在下面的示例中,我使用了 ListView,其中每个项目都是一个单独的命名容器。

如果您想通过 ListView 项模板中的按钮触发面板更新,则在运行时将找不到触发器,并且会发生异常:

<asp:ListView ID="lstView" runat="server">
    <ItemTemplate>
        <asp:Button ID="anotherTrigger" runat="server" Text="This trigger cannot be found!" OnClick="anotherTrigger_Click" />
    </ItemTemplate>
</asp:ListView>
<asp:UpdatePanel runat="server">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="anotherTrigger" EventName="Click" />
    </Triggers>
</asp:UpdatePanel>

根据我的测试,相反的情况(ListView 项目模板中的 UpdatePanel,ListView 外部的触发按钮)确实有效,这似乎与您在评论中提到的注释相矛盾:

<asp:ListView ID="lstView" runat="server">
    <ItemTemplate>
        <asp:UpdatePanel runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="anotherTrigger" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
    </ItemTemplate>
</asp:ListView>
<asp:Button ID="anotherTrigger" runat="server" Text="This trigger works!" OnClick="anotherTrigger_Click" />

最后,UpdatePanel和触发按钮都在ListView项模板中的情况也可以:

<asp:ListView ID="lstView" runat="server">
    <ItemTemplate>
        <asp:Button ID="anotherTrigger" runat="server" Text="This trigger works!" OnClick="anotherTrigger_Click" />
        <asp:UpdatePanel runat="server" UpdateMode="Conditional">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="anotherTrigger" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
    </ItemTemplate>
</asp:ListView>

您可以注意到我在最后一个示例中为面板设置了 UpdateMode="Conditional"。使用此设置,面板仅由其自身的触发器更新。如果该属性设置为UpdateMode="Always",则面板不仅会被自己的触发器更新,还会被页面中其他UpdatePanel 的触发器更新。默认值为 UpdateMode="Always"(如您的代码示例中所示)。