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

Force Postback from a Button in a User Control in an Update Panel

我有一个按钮位于更新面板内的控件内,该按钮未 post 返回服务器,我无法弄清楚原因。

按钮只是一个普通按钮 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>

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

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

几天前我想出了这个问题,现在才意识到我没有回到这个问题上。所以,以防万一有人偶然发现了这个,这是交易。

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

是的,这有点 hack,但 UpdatePanels 通常很荒谬,所以你玩你发的那手牌。