65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (2投票s)

2011年5月11日

CPOL

3分钟阅读

viewsIcon

13984

downloadIcon

458

引言

之前我有一个项目需要在各处使用很多弹出窗口来输入和编辑数据,但我必须在 asp.net 中执行回发来注册弹出窗口的启动脚本,并且无法检测到弹出窗口关闭,所以不得不使用悬停的 div 或让用户刷新窗口才能看到他们所做的更改。
此控件将解决这些需求,我发现它非常易于使用。

背景

对 javascript 和复合控件的一些理解将帮助您理解和自定义控件。

理解代码

此控件由两部分组成,首先是包含服务器端功能的 asp 控件,其次是处理客户端事务的 javascript。

  • 该控件继承自 CompositeControl 类并实现 IPostBackEventHandler,它根据通过 url、PopupWidth、hight 等属性提供的参数生成 javascript 函数行(使用 JFunc() 方法),并将其嵌入到 <a> 标签的 href 属性中,该标签将在客户端被调用。它还在 ScriptManager 中注册 PopupHandler.js,以便它可用于上述函数调用。
    此外,每次属性更改时,都会调用 SetProps() 方法以确保显示更改。
    此控件有一个事件 PopupClose,当用户关闭弹出窗口时触发。
  • javascript 执行两个任务:
  1. 显示弹出窗口。 我试图包含显示与 IE、Opera 和 FireFox 兼容的模态和非模态弹出窗口的方法。
    IE 支持 window.showModalDialog() 方法,如果浏览器支持,将会调用该方法,这可以通过以下代码行检测到
  2. if (window.showModalDialog){...} 

    否则将调用 window.open() 方法。每种方法都有自己的传递参数和选项的方式,因此将相应地准备选项字符串。

  3. 检测弹出窗口关闭,导致回发并在服务器端触发事件。 
  4. SetCloseHandler() 方法将创建一个计时器,该计时器以 100 毫秒的间隔检查弹出窗口,当检测到其关闭时,将触发 __doPostBack()

使用代码

使用该控件非常容易

  1. 将 "PopupCommand" 文件夹复制到您的项目中(最好复制到一个名为 "Popup" 的新程序集项目中,否则将 PopupCommand.cs 中的 "Popup" 命名空间更改为您想要的命名空间 [第 12,13,14,53 行])
  2. 将 "PopupHandler.js" 的 BuildAction 设置为 "Embedded Resource" 并构建项目
  3. 从工具箱中将新添加的名为 PopupCommand 的项目拖到需要弹出控件的任何位置
    <hmc:PopupCommand
    	ID="PopupCommand1"
    	runat="server" />
    
  4. 根据您的需要设置控件的参数
    <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: 当用户关闭弹出窗口时触发,并将返回属性中指定的命令名称和参数
© . All rights reserved.