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



考虑以下代码片段:

<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",则面板不仅由其自己的触发器更新,还由页面中其他UpdatePanels的触发器更新。默认值为UpdateMode="Always"(如代码示例中所示)。

最新更新