如何只关闭第二个 ajaxToolkit:ModalPopupExtender?
排障赵师傅
结论
在第二个弹窗的 OK 和 Cancel 服务器端事件中,先隐藏确认弹窗,再调用第一个 ModalPopupExtender 的 Show():
MPE_Example_Panel_Like_Browser_Confirmation.Hide();
MPE_Example_Panel_Like_Browser.Show();
确认弹窗关闭后,第一个弹窗会在回发完成时重新显示。
原因
asp:Button 的 OnClick 会触发服务器回发。页面重新渲染时,第一个 ModalPopupExtender 不会保留回发前的显示状态。
所以,只对第二个弹窗调用 Hide() 时,第一个弹窗仍可能在页面返回浏览器后消失。需要在同一次服务器事件中调用第一个弹窗的 Show(),恢复其显示状态。
修改后台事件
将两个确认按钮的事件处理方法改为:
protected void btnMPE_Example_Panel_Like_Browser_Confirmation_OK_Click(
object sender,
EventArgs e)
{
MPE_Example_Panel_Like_Browser_Confirmation.Hide();
lbMPE_Example_Panel_Like_Browser_Saved.Text = "Saved";
lbModal_Response_Display.Text =
"Modal Popup Example Panel Like Browser Confirmation - OK";
MPE_Example_Panel_Like_Browser.Show();
}
protected void btnMPE_Example_Panel_Like_Browser_Confirmation_Cancel_Click(
object sender,
EventArgs e)
{
MPE_Example_Panel_Like_Browser_Confirmation.Hide();
lbMPE_Example_Panel_Like_Browser_Saved.Text = "Cancel";
lbModal_Response_Display.Text =
"Modal Popup Example Panel Like Browser Confirmation - Cancel";
MPE_Example_Panel_Like_Browser.Show();
}
事件处理顺序如下:
- 调用
MPE_Example_Panel_Like_Browser_Confirmation.Hide()关闭第二个弹窗。 - 更新需要显示的
Label。 - 调用
MPE_Example_Panel_Like_Browser.Show(),让第一个弹窗在回发后重新显示。
注意事项
两个按钮已经设置 CausesValidation="false",可避免无关的页面验证阻止事件执行:
<asp:Button
ID="btnMPE_Example_Panel_Like_Browser_Confirmation_OK"
runat="server"
Text="OK"
OnClick="btnMPE_Example_Panel_Like_Browser_Confirmation_OK_Click"
CausesValidation="false" />
<asp:Button
ID="btnMPE_Example_Panel_Like_Browser_Confirmation_Cancel"
runat="server"
Text="Cancel"
OnClick="btnMPE_Example_Panel_Like_Browser_Confirmation_Cancel_Click"
CausesValidation="false" />
如果按钮需要执行自定义服务器事件,不要再将它配置为 ModalPopupExtender 的 OkControlID 或 CancelControlID,以免客户端自动关闭行为与服务器端处理相互影响。当前写法由事件处理方法直接控制两个弹窗,执行逻辑更清楚。
备注:内容仅供参考。
