将页面上的任何按钮作为 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"
(如您的代码示例中所示)。
考虑以下代码片段:
<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"
(如您的代码示例中所示)。