带有关闭检测功能的 ASP.NET 弹出复合控件





4.00/5 (2投票s)
引言
之前我有一个项目需要在各处使用很多弹出窗口来输入和编辑数据,但我必须在 asp.net 中执行回发来注册弹出窗口的启动脚本,并且无法检测到弹出窗口关闭,所以不得不使用悬停的 div 或让用户刷新窗口才能看到他们所做的更改。
此控件将解决这些需求,我发现它非常易于使用。
背景
对 javascript 和复合控件的一些理解将帮助您理解和自定义控件。
理解代码
此控件由两部分组成,首先是包含服务器端功能的 asp 控件,其次是处理客户端事务的 javascript。
- 该控件继承自 CompositeControl 类并实现 IPostBackEventHandler,它根据通过 url、PopupWidth、hight 等属性提供的参数生成 javascript 函数行(使用 JFunc() 方法),并将其嵌入到 <a> 标签的 href 属性中,该标签将在客户端被调用。它还在 ScriptManager 中注册 PopupHandler.js,以便它可用于上述函数调用。
此外,每次属性更改时,都会调用 SetProps() 方法以确保显示更改。
此控件有一个事件 PopupClose,当用户关闭弹出窗口时触发。
- javascript 执行两个任务:
- 显示弹出窗口。 我试图包含显示与 IE、Opera 和 FireFox 兼容的模态和非模态弹出窗口的方法。
IE 支持 window.showModalDialog() 方法,如果浏览器支持,将会调用该方法,这可以通过以下代码行检测到 - 检测弹出窗口关闭,导致回发并在服务器端触发事件。
if (window.showModalDialog){...}
否则将调用 window.open() 方法。每种方法都有自己的传递参数和选项的方式,因此将相应地准备选项字符串。
SetCloseHandler() 方法将创建一个计时器,该计时器以 100 毫秒的间隔检查弹出窗口,当检测到其关闭时,将触发 __doPostBack()
使用代码
使用该控件非常容易
- 将 "PopupCommand" 文件夹复制到您的项目中(最好复制到一个名为 "Popup" 的新程序集项目中,否则将 PopupCommand.cs 中的 "Popup" 命名空间更改为您想要的命名空间 [第 12,13,14,53 行])
- 将 "PopupHandler.js" 的 BuildAction 设置为 "Embedded Resource" 并构建项目
- 从工具箱中将新添加的名为 PopupCommand 的项目拖到需要弹出控件的任何位置
<hmc:PopupCommand ID="PopupCommand1" runat="server" />
- 根据您的需要设置控件的参数
<hmc:PopupCommand ID="PopupCommand1" runat="server" Url="http://www.google.com" Text="Popup" ImageUrl="~/Images/Image.png" />
您还可以双击插入的控件并处理 PopupClose 服务器事件
属性
- Text: 要显示的文本
- EntityName: 弹出窗口中显示的实体的名称(可选)
- EntityID: 弹出窗口中显示的实体的唯一标识符(可选)
如果存在,它还会替换 url 中的 @ID,这样动态生成的 url 可以包含实体的 ID - Url: 弹出窗口中显示的页面的 Url
- PopupWidth: 弹出窗口的宽度
- PopupHeight: 弹出窗口的高度
- ImageUrl: 要显示在控件文本旁边的图像的 Url
- CommandName: 将传递给 PopupClose 事件的服务器端事件处理程序的命令名称
- CommandArgument: 将传递给 PopupClose 事件的服务器端事件处理程序的命令参数
事件
- PopupClose: 当用户关闭弹出窗口时触发,并将返回属性中指定的命令名称和参数