摘要:本文讨论如何以ASP.NET中的CodeBehind方式实现各种弹出窗口,实现与弹出窗口的交互。并探讨常用非标准IE浏览器对弹出的窗口的各种过滤行为及使用弹出窗口相应对策,以期给出使用弹出窗口的一个通用较优方案。
关键词:ASP.NET、CodeBehind、过滤、COM接口、JavaScript、绑定
作为Microsoft的最新建立动态Web网站的工具,ASP.NET相对于ASP和JSP在改变原始的Web编程方式方面有了长足的长进。它的代码与页面分离技术(CodeBehind)以及完善的Web服务器控件为程序员提供了一个更加符合传统编程的Web服务器端开发方式。但Web编程还是有着与传统编程不相同的特点,这些特点决定了ASP.NET编程中必须以一些特殊的技巧来完成程序要求,弹出窗口正是这类编程方式的代表。相当多的编程书籍对弹出窗口采取缄默或者一语带过,似乎看不过弹出窗口的巨大使用天地。本文将为你解开弹出窗口使用中的大多数问题。
为了提高网站的访问的并发度和吞吐量,与其它服务器脚本一样,ASP.NET同样使用了客户端脚本来减轻服务器的压力。ASP.NET到现在(1.1版)为止并不直接支持弹出窗口,必须通过JavaScript(或VBScript)来使用客户端弹出窗口。
一、 警告窗口与在CodeBehind中使用客户端脚本的方式
要在浏览器中弹出一个最简单的警告窗口,可以使用JavaScript语句:
window.alert( [sMessage])
其中,sMessage是提示信息。可惜,这样的弹出窗口是只有一个“确定”按钮,只能起到提示作用。如果我们要在删除记录时候弹出一个询问的弹出窗口,此时你需要使用:
bConfirmed = window.confirm( [sMessage])
其中:bConfirmed是返回值,sMessage是提示信息。这个弹出窗口有两种选择:“确定”或“放弃”,其选择的返回值放在bConfirmed中,可供代码作出判断。
为了提高代码的可重用性与可读性,应当使JavaScript与Codehind相互溶合。通常有两种方式可以达到这样的效果。
(1) 使用Response.Write方法:
使用Response.Write方法早在ASP时代就已经被支持了。它可以把代码写到客户端,是一种相当方便且直观的方法。以下代码演示了如何使用Response.Write方法来显示一个警告信息。
Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAlert.Click
’演示Response.Write方法和alert窗口。
Response.Write(" ")
End Sub
(2) 使用RegisterXXX方法
如果你观察Response.Write的生成HTML代码,你会发现Response.Write方法生成的代码是写到了HTML代码的最开始,即标签之前。此时,所有的 HTML对象都还没有生成,如果要想使用HTML内的对象,并与之交互,就会出现“找不到对象”的错误。因此,笔者推荐一个更加符合CodeBehind方式的方式----使用RegisterXXX方法。RegisterXXX包括:RegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数。
RegisterStartupScript 的原型是:
Overridable Public Sub RegisterStartupScript( _
ByVal key As String, _
ByVal script As String _
)
其中:key表示这个脚本的唯一标识,script是代表脚本的字符串。
RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置。RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句(这在我们后面的例子中看到),则推荐使用RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或Response.Write。
为了防止在页面中反复加入脚本,在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作为注册的Key,然后在程序中可以使用IsClientScriptBlockRegistered作判断。
以下例子将使用RegisterClientScriptBlock来演示confirm的使用方法。
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConfirm.Click
’演示RegisterClientScriptBlock方法和confirm窗口
If (Not IsClientScriptBlockRegistered("clientScript")) Then
‘判断是否已经加入了该脚本,没有则加入。
Dim strScript As String
strScript = " "
‘注册脚本
RegisterClientScriptBlock("clientScript", strScript)
‘如果选择”否”,则继续向下执行。
End If
End Sub
二、 弹出指定页面
光有提示窗口还远远不能满足我们的要求,在程序中,我们常常需要弹出指定页面。此时可以使用JavaScript的window.open方法。配合前面的RegisterClientSciptBlock方法,我们就可以实现指定页面的弹出。
以下代码展示了如何弹出指定页面:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
’使用window.open与registerStartupScript简单演示。
If (Not IsClientScriptBlockRegistered("OpenScript")) Then
’判断是否已经加入了该脚本,没有则加入。
Dim strScript As String = " "
RegisterStartupScript("OpenScript", strScript)
End If
End Sub
程序使用Window.open方法来弹出新的页面,它只一个参数:新的弹出窗口的URL地址。事实在window.open方法有多个参数,但这是javascipt的简单内容,我们将不会在这儿详细分说。如果你有相关的问题,请查询MSDN。
这段程序在IE中直接使用一切正常。但如果你正在使用类如GoSurf、MyIE2、NetCapter之类的浏览器,那么,很不幸! 你将看不到弹出窗口。这就是我们将要讨论的弹出窗口过滤问题。
三、 非标准IE浏览器对弹出窗口的过滤行为讨论
广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用IE内核支持多页面并能自动屏蔽广告的软件。据说在即将发布的IE6 sp2中微软也将加入封杀广告窗口功能。这对大多数网民当然是件好事,可对于程序员而言,我们使用弹出窗口的方式与一般广告并无本质的不同,这样的窗口也会被弹出窗口管理器不分青红皂白的封杀,其结果当然是我们不愿看到的。有没有一个标准的方式能让窗口正常的弹出呢?这就要求我们了解浏览器封杀广告的原理。通常的广告封杀器使用以下三种方式进行广告过滤:
(1)、基于窗口标题的封杀方式
这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表(由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗口。显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。不过,依据它进行的变形方式倒使用得相当的普遍。那就是,基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。
(2)、基于窗口类和位置的封杀方式
经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。进一步分析发现:广告窗口的WorkerA类和Shell DocObject View类的rect.top的值是相同的,正常IE窗口的WorkerA类和Shell DocObject View类的rect.top的值是不相同的。根据以上两点就可以书写广告杀手程序了。 事实上,我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现,在Windows2000( 笔者使用的操作系统)中,IE窗口的类都为IEFrame。同时,由于Win2000是一个基于Unicode代码的操作系统,所以没有WorkerA类,而以WorkerW类取而代之。同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXP操作系统,所以不能针对WindowsXP作进一步的试验。
(3)、基于IE COM组件的封杀方式
以上两种方式都是把IE窗口当作一个普通的Windows窗口对待,进行判断的。事实上,IE是一个典型的基于COM组件的浏览器,所有的基于IE内核的浏览器都是包装shdocvw.dll文件,然后书写相应的BHO代码。只有这样才能做到真正的控制IE浏览器,而不是方法一、二这样的隔靴搔痒。
还有一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事件,执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)方法。重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是,说明是正常的弹出窗口,反之加以拦截。
由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。
关键词:ASP.NET、CodeBehind、过滤、COM接口、JavaScript、绑定
作为Microsoft的最新建立动态Web网站的工具,ASP.NET相对于ASP和JSP在改变原始的Web编程方式方面有了长足的长进。它的代码与页面分离技术(CodeBehind)以及完善的Web服务器控件为程序员提供了一个更加符合传统编程的Web服务器端开发方式。但Web编程还是有着与传统编程不相同的特点,这些特点决定了ASP.NET编程中必须以一些特殊的技巧来完成程序要求,弹出窗口正是这类编程方式的代表。相当多的编程书籍对弹出窗口采取缄默或者一语带过,似乎看不过弹出窗口的巨大使用天地。本文将为你解开弹出窗口使用中的大多数问题。
为了提高网站的访问的并发度和吞吐量,与其它服务器脚本一样,ASP.NET同样使用了客户端脚本来减轻服务器的压力。ASP.NET到现在(1.1版)为止并不直接支持弹出窗口,必须通过JavaScript(或VBScript)来使用客户端弹出窗口。
一、 警告窗口与在CodeBehind中使用客户端脚本的方式
要在浏览器中弹出一个最简单的警告窗口,可以使用JavaScript语句:
window.alert( [sMessage])
其中,sMessage是提示信息。可惜,这样的弹出窗口是只有一个“确定”按钮,只能起到提示作用。如果我们要在删除记录时候弹出一个询问的弹出窗口,此时你需要使用:
bConfirmed = window.confirm( [sMessage])
其中:bConfirmed是返回值,sMessage是提示信息。这个弹出窗口有两种选择:“确定”或“放弃”,其选择的返回值放在bConfirmed中,可供代码作出判断。
为了提高代码的可重用性与可读性,应当使JavaScript与Codehind相互溶合。通常有两种方式可以达到这样的效果。
(1) 使用Response.Write方法:
使用Response.Write方法早在ASP时代就已经被支持了。它可以把代码写到客户端,是一种相当方便且直观的方法。以下代码演示了如何使用Response.Write方法来显示一个警告信息。
Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAlert.Click
’演示Response.Write方法和alert窗口。
Response.Write(" ")
End Sub
(2) 使用RegisterXXX方法
如果你观察Response.Write的生成HTML代码,你会发现Response.Write方法生成的代码是写到了HTML代码的最开始,即标签之前。此时,所有的 HTML对象都还没有生成,如果要想使用HTML内的对象,并与之交互,就会出现“找不到对象”的错误。因此,笔者推荐一个更加符合CodeBehind方式的方式----使用RegisterXXX方法。RegisterXXX包括:RegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数。
RegisterStartupScript 的原型是:
Overridable Public Sub RegisterStartupScript( _
ByVal key As String, _
ByVal script As String _
)
其中:key表示这个脚本的唯一标识,script是代表脚本的字符串。
RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置。RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句(这在我们后面的例子中看到),则推荐使用RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或Response.Write。
为了防止在页面中反复加入脚本,在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作为注册的Key,然后在程序中可以使用IsClientScriptBlockRegistered作判断。
以下例子将使用RegisterClientScriptBlock来演示confirm的使用方法。
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConfirm.Click
’演示RegisterClientScriptBlock方法和confirm窗口
If (Not IsClientScriptBlockRegistered("clientScript")) Then
‘判断是否已经加入了该脚本,没有则加入。
Dim strScript As String
strScript = " "
‘注册脚本
RegisterClientScriptBlock("clientScript", strScript)
‘如果选择”否”,则继续向下执行。
End If
End Sub
二、 弹出指定页面
光有提示窗口还远远不能满足我们的要求,在程序中,我们常常需要弹出指定页面。此时可以使用JavaScript的window.open方法。配合前面的RegisterClientSciptBlock方法,我们就可以实现指定页面的弹出。
以下代码展示了如何弹出指定页面:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
’使用window.open与registerStartupScript简单演示。
If (Not IsClientScriptBlockRegistered("OpenScript")) Then
’判断是否已经加入了该脚本,没有则加入。
Dim strScript As String = " "
RegisterStartupScript("OpenScript", strScript)
End If
End Sub
程序使用Window.open方法来弹出新的页面,它只一个参数:新的弹出窗口的URL地址。事实在window.open方法有多个参数,但这是javascipt的简单内容,我们将不会在这儿详细分说。如果你有相关的问题,请查询MSDN。
这段程序在IE中直接使用一切正常。但如果你正在使用类如GoSurf、MyIE2、NetCapter之类的浏览器,那么,很不幸! 你将看不到弹出窗口。这就是我们将要讨论的弹出窗口过滤问题。
三、 非标准IE浏览器对弹出窗口的过滤行为讨论
广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用IE内核支持多页面并能自动屏蔽广告的软件。据说在即将发布的IE6 sp2中微软也将加入封杀广告窗口功能。这对大多数网民当然是件好事,可对于程序员而言,我们使用弹出窗口的方式与一般广告并无本质的不同,这样的窗口也会被弹出窗口管理器不分青红皂白的封杀,其结果当然是我们不愿看到的。有没有一个标准的方式能让窗口正常的弹出呢?这就要求我们了解浏览器封杀广告的原理。通常的广告封杀器使用以下三种方式进行广告过滤:
(1)、基于窗口标题的封杀方式
这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表(由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗口。显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。不过,依据它进行的变形方式倒使用得相当的普遍。那就是,基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。
(2)、基于窗口类和位置的封杀方式
经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。进一步分析发现:广告窗口的WorkerA类和Shell DocObject View类的rect.top的值是相同的,正常IE窗口的WorkerA类和Shell DocObject View类的rect.top的值是不相同的。根据以上两点就可以书写广告杀手程序了。 事实上,我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现,在Windows2000( 笔者使用的操作系统)中,IE窗口的类都为IEFrame。同时,由于Win2000是一个基于Unicode代码的操作系统,所以没有WorkerA类,而以WorkerW类取而代之。同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXP操作系统,所以不能针对WindowsXP作进一步的试验。
(3)、基于IE COM组件的封杀方式
以上两种方式都是把IE窗口当作一个普通的Windows窗口对待,进行判断的。事实上,IE是一个典型的基于COM组件的浏览器,所有的基于IE内核的浏览器都是包装shdocvw.dll文件,然后书写相应的BHO代码。只有这样才能做到真正的控制IE浏览器,而不是方法一、二这样的隔靴搔痒。
还有一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事件,执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)方法。重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是,说明是正常的弹出窗口,反之加以拦截。
由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。
发表评论
-
ASP.net把datatable与list转成json输出
2014-12-10 12:02 824源代码: //DataTable转成Json ... -
开发问题集锦
2014-09-18 16:45 7131.SWFUpload问题 "触发uploadErr ... -
repeater嵌套使用
2014-09-16 18:38 776前台: <div id="m ... -
ASP.NET环境下使用KindEditor
2013-11-26 16:46 2908最新版的KindEditor,按照在线文档http://www ... -
ASP.NET+jQuery轮播效果
2013-08-21 08:03 2866<style type="text/css&q ... -
ASP.NET与Sql Server数据库的空数据的交互
2013-08-02 22:55 1001数据库中的字段:(1) ArticleId int型 外键 可 ... -
设置网页的Title、keywords和description
2013-03-20 15:35 877protected void Page_Load(obje ... -
再谈<<在ASP.NET中重写URL>>
2013-02-20 09:17 897将之前的<<在ASP.NET中重写URL>& ... -
VS2010母版版引入js和css文件
2012-10-31 17:15 876动态引入js文件和css样式表文件 1 引入js文件 Ht ... -
.NET网站中利用jQuery Ajax获取后台数据
2011-12-19 11:59 3334一般处理程序 using System.Web.Script. ... -
解决:Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)
2011-12-09 10:21 1280解决:Sys.WebForms.PageRequestMana ... -
在ASP.NET中重写URL
2011-12-08 18:02 759目标:将网页地址伪静态 实现:在Global.asax中改写: ... -
ashx文件使用Session(转)
2011-12-02 11:25 859查阅MSDN得到ashx文件要使用Session,必须实现Se ... -
作品展示
2011-11-05 16:27 828刚开发完成 看一下效果 [img][/img] ... -
ASP.NET上传大文件
2011-10-27 17:20 4028上网下一个neatupload 1.2.32的压缩包:(附压缩 ... -
asp .NET弹出窗口汇总(转)
2011-08-16 09:39 622注: //关闭,父窗口弹出对话框,子窗口直接关闭 this ... -
asp.net中的验证控件的使用
2010-04-07 16:35 1013前台: <h4>验证控件使用测试< ... -
.net利用AJAX实现局部刷新
2010-04-07 16:30 3347前台: <div> ... -
一个SQL Server2000和2005都能用的分页方法
2010-04-07 16:25 1033(1)存储过程(SQL2000和2005下都可用): ... -
数据控件+PagedDataSource完成分页
2010-04-07 15:59 1048前台: <asp:Repeater ...
相关推荐
在ASP.NET中,弹出窗口通常是通过JavaScript实现的,因为ASP.NET自身并不直接支持弹出窗口功能。 在ASP.NET中创建弹出窗口,通常涉及到两种主要的JavaScript函数:`window.alert()` 和 `window.confirm()`. `window...
在《精通ASP.NET MVC 3框架》一书中,第三章详细介绍了如何使用ASP.NET MVC框架构建一个简单的数据-实体应用程序。本章不仅适合初学者了解ASP.NET MVC的基本概念,还为有一定基础的开发者提供了深入实践的机会。通过...
2. **填写控制器名称:** 在弹出的对话框中输入控制器名称为 HomeController,确保模板选项选择为空控制器。 3. **生成控制器:** 点击添加按钮,Visual Studio 将自动生成 HomeController 类。 4. **编辑控制器...
【GridView精通】是关于ASP.NET开发中的一个关键控件——GridView的深度学习和应用。GridView是一种数据呈现控件,常用于展示和操作数据库中的数据,如分页、排序、选择、编辑、删除等功能。 1. **无代码分页排序**...
1. **模态框(Modal)**:在当前页面上弹出一个对话窗口,无需跳转到新的页面。 2. **下拉菜单(Dropdowns)**:在导航条或其他位置创建可展开和折叠的菜单。 3. **按钮组(Button Groups)**:将多个按钮组织在一起...
- **popup.asp**:可能涉及到弹出窗口的实现,如通知、对话框或者模态窗口。 - **admin.asp**:可能是管理员界面,用于管理网站内容和设置。 - **web.config.xml.asp**:通常在ASP.NET中,`web.config`文件用于存储...
- `alert()`:用于弹出一个带有消息的警告框。 - `confirm()`:显示一个对话框,询问用户是否确认某个操作。 - `prompt()`:请求用户输入信息。 - `navigate()`:浏览器导航相关操作(此处可能为错误,...
网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的...
9:采用Messenger的弹出滑动消息提示框. 10:下载管理,虚拟文件夹. 11:自动ping. 12:连接到搜索引擎. 13:自动报告bug,建议等. 14:宏功能. 15:自动同步文件夹. 16:保存加载任务. 17:计划任务. 18:单线程下载时不能创建...
XML创建了标识,而DOM的作用就是告诉script如何在浏览器窗口中操作和显示这些标识 上面我们已经简要的讲述了一些XML的基本原理,我们来看看它们之间的关联以及它们是如何工作的,先看这里一张图: 1.XML描述...