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

时间:2015-12-17 19:51:58

标签: c# asp.net updatepanel

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

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

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

我在加载用户控件时注册了click事件:

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'.我也试图直接在标记中注册控件,结果相同。

  • 我尝试在此帖子之后将按钮包装在自己的更新面板中:Custom User Control in UpdatePanel forcing Postback。这与我所看到的行为没有区别。

我对更新面板不是很熟悉所以我的想法已经不多了。有人知道我的按钮没有回发到服务器的原因吗?

1 个答案:

答案 0 :(得分:1)

我几天前想到这一点,刚才意识到我没有回到这个问题。所以,万一有人偶然发现这件事,这就是交易。

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

是的,这有点像黑客攻击,但一般来说UpdatePanels都是荒谬的,所以你玩的是你玩的手。