在开发Web应用程序时,经常会遇到需要使用模态对话框(Modal Popup)的场景。ModalPopupExtender是一个非常有用的控件,它能够创建一个覆盖页面其他部分的模态对话框,使得用户只能与对话框部分进行交互。然而,当尝试在一个模态对话框中打开另一个模态对话框时,遇到了一个问题:第一个模态对话框并没有被隐藏,用户仍然可以与之交互。这可能会破坏应用程序的逻辑。为了解决这个问题,开发了一个名为ModelPopupRelation的用户控件,它能够在父模态对话框上设置子模态对话框。这样,就可以嵌套任意数量的模态对话框。
在开始介绍ModelPopupRelation控件之前,先了解一下模态对话框的工作原理。模态对话框通常由一个触发按钮和一个显示详细内容的Panel组成。当用户点击触发按钮或者通过代码动态调用Show()方法时,模态对话框就会显示出来。在HTML页面中,模态对话框的背景元素是一个覆盖整个页面的div,它阻止用户与页面的其他部分进行交互。
ModelPopupRelation控件实现了ModalPopupExtender不支持的功能,即在一个模态对话框上设置另一个模态对话框。它提供了三个属性:ParentModelPopupID、ChildModelPopupID和Start。ParentModelPopupID是第一个ModalPopupExtender的ID,它将显示第二个模态对话框。ChildModelPopupID是第二个模态对话框的控件。Start属性默认为true,它允许控件在模态对话框之间设置关系。
为了实现这个功能,需要一些服务器端的方法。GetControlClientID方法用于获取模态对话框的客户端ID,这个ID在客户端脚本中需要用到。ModalPopupExtenderControlSearch方法用于在整个页面中搜索模态对话框控件。这两个方法都有详细的注释。
客户端脚本中有几个关键的函数。EndRequestHandler函数在异步回发完成后被调用,它会调用CreateRelation函数。CreateRelation函数接受两个参数,分别是父模态对话框和子模态对话框的客户端ID。它通过设置子模态对话框的z-index来实现用户控件的主要逻辑。Get_PopUpContrl函数通过PopupControlID来搜索模态对话框控件。
当ModalPopupExtender渲染时,它会生成z-index。在父对话框的背景元素中,z-index被设置为10000。这个z-index用于控制模态对话框的显示顺序。在嵌套对话框的情况下,需要为所有打开的对话框设置一系列的z-index,以确保它们按照正确的顺序显示。
在文档的最后,再次强调这个控件的概念。需要为所有以嵌套方式打开的对话框设置一系列的z-index。可以添加自己的逻辑来设置所有对话框的z-index。
<uc1:ModelPopupRelation ID="ModelPopupRelation1" runat="server" ParentModelPopupID="mpeFirstDialogBox" ChildModelPopupID="mpeSecondDialogBox" Start="false" />