从更新面板中的用户控件中的按钮强制Postback

本文关键字:按钮 Postback 控件 用户 更新 | 更新日期: 2023-09-27 18:27:17

我在一个更新面板内的控件中有一个按钮,它不会返回到服务器,我不知道为什么。

按钮只是一个普通的asp:button:

<asp:Button ID="btnContinue" runat="server" CssClass="close-reveal-modal button-primary" Text="Continue"></asp:Button>

我在加载用户控件时注册它的点击事件:

btnContinue.Click += new EventHandler(btnContinue_Click);

包含按钮的控件是此页面上的BestAvailable控件,在此UpdatePanel中:

<asp:UpdatePanel runat="server" ID="updatePnlBestAvailable" class="best-available" ChildrenAsTriggers="true">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnReserve" EventName="Click" />
    </Triggers>
    <ContentTemplate>
        <uc:BestAvailable runat="server" ID="BestAvailableControl"></uc:BestAvailable>
        <div id="bestAvailablePanelControls">
            <asp:Button runat="server" Style="display: none;" ID="ChangeButton" 
                OnClick="Change_Click" ClientIDMode="static" 
                CssClass="ChangeButton" />
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

按钮上的回发根本没有发生,我在点击事件处理程序的第一行有一个断点,它从未命中。据我的同事说,这是因为按钮在前面提到的更新面板中。我尝试了几种方法来解决这个问题,但都没有成功。

  • 我试图将按钮id和PostBackTrigger添加到我的更新面板中,就像在用户控件和包含控件中一样:

    UpdatePanelControlTrigger trigger = new PostBackTrigger();
    trigger.ControlID = this.BestAvailableControl.btnContinue.UniqueID;
    updatePnlBestAvailable.Triggers.Add(trigger);

    结果是一个例外,说A control with ID '<unique id prefix>$btnContinue' could not be found for the trigger in UpdatePanel 'updatePnlBestAvailable'.我也试图在标记中直接注册控件,结果相同。

  • 在这篇文章之后,我尝试将按钮包装在它自己的更新面板中:UpdatePanel中的自定义用户控件强制Postback。这对我所看到的行为没有任何影响。

我对更新面板不是很熟悉,所以我没有什么想法了。有人知道为什么我的按钮没有发回服务器吗?

从更新面板中的用户控件中的按钮强制Postback

我几天前发现了这个问题,现在才意识到我没有回到这个问题上来。所以,为了防止有人偶然发现这一点,我们达成了协议。

我意识到更新面板确实阻止了帖子的回复。尽管ChildrenAsTriggers被设置为true,但按钮位于另一个用户控件内意味着它根本不会回发。我最终在更新面板内直接创建了一个隐藏的第二个按钮,并使用JavaScript使原始按钮单击第二个,这确实导致了回发。服务器代码再次运行后,我调用了原始按钮的点击事件。

是的,这有点像黑客,但更新面板通常都很荒谬,所以你可以用你得到的牌。