繁体   English   中英

使页面上的任何按钮作为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为rickyUPTrigger的按钮作为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" />

最后,在ListView项模板中同时使用UpdatePanel和Trigger按钮的情况也适用:

<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" (如您的代码示例中一样)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM