从更新面板中的用户控件中的按钮强制回发
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 根本没有发生,我在单击事件处理程序的第一行有一个断点,但它从未被击中。据我的同事说,这是因为按钮位于上述更新面板中。我已经尝试了几种方法来解决这个问题,但都没有成功。
我试图将按钮 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'.
我也尝试直接在标记中注册控件,结果相同。
我尝试在 post: Custom User Control in UpdatePanel forcing Postback 之后将按钮包装在自己的更新面板中。这对我所看到的行为没有影响。
我对更新面板不是很熟悉,所以我 运行 没有想法。有人知道为什么我的按钮没有 post 返回服务器吗?
几天前我想出了这个问题,现在才意识到我没有回到这个问题上。所以,以防万一有人偶然发现了这个,这是交易。
我意识到更新面板确实阻止了 post 返回。尽管 ChildrenAsTriggers
被设置为 true
,但按钮位于另一个用户控件内意味着它根本不会 post 返回。我最终直接在更新面板内创建了一个隐藏的第二个按钮,并使用 JavaScript 使原始按钮单击第二个按钮,这确实导致 post 返回。一旦服务器代码再次为运行,我调用了原始按钮的点击事件。
是的,这有点 hack,但 UpdatePanels 通常很荒谬,所以你玩你发的那手牌。
我有一个按钮位于更新面板内的控件内,该按钮未 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 根本没有发生,我在单击事件处理程序的第一行有一个断点,但它从未被击中。据我的同事说,这是因为按钮位于上述更新面板中。我已经尝试了几种方法来解决这个问题,但都没有成功。
我试图将按钮 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'.
我也尝试直接在标记中注册控件,结果相同。我尝试在 post: Custom User Control in UpdatePanel forcing Postback 之后将按钮包装在自己的更新面板中。这对我所看到的行为没有影响。
我对更新面板不是很熟悉,所以我 运行 没有想法。有人知道为什么我的按钮没有 post 返回服务器吗?
几天前我想出了这个问题,现在才意识到我没有回到这个问题上。所以,以防万一有人偶然发现了这个,这是交易。
我意识到更新面板确实阻止了 post 返回。尽管 ChildrenAsTriggers
被设置为 true
,但按钮位于另一个用户控件内意味着它根本不会 post 返回。我最终直接在更新面板内创建了一个隐藏的第二个按钮,并使用 JavaScript 使原始按钮单击第二个按钮,这确实导致 post 返回。一旦服务器代码再次为运行,我调用了原始按钮的点击事件。
是的,这有点 hack,但 UpdatePanels 通常很荒谬,所以你玩你发的那手牌。