ASP.NET含iframe弹窗点击确认/取消后,无法触发父页面OnClick问题求助
解决方案
方案一:全局状态标记+客户端点击判断
- 父页面定义全局变量,标记是否已完成确认操作:
var isConfirmed = false; - 修改触发弹窗的ASP.NET按钮
onClientClick事件,根据状态决定显示弹窗或允许回发:<asp:Button ID="btnSubmit" runat="server" Text="提交" onClientClick="if (!isConfirmed) { showPopup(); return false; } return true;" OnClick="btnSubmit_Click" /> - iframe内确认按钮的点击逻辑:
// 标记确认状态 window.parent.isConfirmed = true; // 关闭父页面弹窗 window.parent.closePopup(); // 触发父页面按钮点击,此时onClientClick会返回true,触发服务器端OnClick window.parent.document.getElementById('<%= btnSubmit.ClientID %>').click(); - iframe内取消按钮仅需关闭弹窗:
window.parent.closePopup();
方案二:直接调用__doPostBack触发服务器端事件(绕过客户端onClientClick)
这种方式无需修改原按钮的客户端事件,直接触发服务器端回发:
- iframe内确认按钮的点击逻辑:
// 关闭父页面弹窗 window.parent.closePopup(); // 直接触发目标按钮的服务器端OnClick事件,不会触发客户端onClientClick window.parent.__doPostBack('<%= btnSubmit.UniqueID %>', ''); - 若需传递确认/取消状态给服务器,可在父页面添加隐藏字段:
确认时设置字段值:<asp:HiddenField ID="hfResult" runat="server" />
取消时设为window.parent.document.getElementById('<%= hfResult.ClientID %>').value = 'true';'false',服务器端btnSubmit_Click事件中读取hfResult.Value即可判断操作结果。
关于无限循环的原因
原按钮的onClientClick会执行弹窗逻辑并返回false阻止回发,当iframe内调用按钮.click()时,会再次触发onClientClick导致弹窗重复显示,形成循环。方案一通过状态标记让第二次点击跳过弹窗逻辑,方案二直接绕过客户端事件触发服务器端回发,均可解决循环问题。
内容的提问来源于stack exchange,提问作者DragonFire
相关产品推荐
相关产品推荐

