PAYATHON 2026

如何只关闭第二个 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();
}

事件处理顺序如下:

  1. 调用 MPE_Example_Panel_Like_Browser_Confirmation.Hide() 关闭第二个弹窗。
  2. 更新需要显示的 Label。
  3. 调用 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,以免客户端自动关闭行为与服务器端处理相互影响。当前写法由事件处理方法直接控制两个弹窗,执行逻辑更清楚。

备注:内容仅供参考。