精通ASP.NET中弹出技术

 更新时间:2012年10月06日 22:57:48   投稿:mdxy-dxy  
本文讨论如何以ASP.NET中的CodeBehind方式实现各种弹出窗口,实现与弹出窗口的交互

并探讨常用非标准IE浏览器对弹出的窗口的各种过滤行为及使用弹出窗口相应对策,以期给出使用弹出窗口的一个通用较优方案。

作为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之类的浏览器,那么,很不幸! 你将看不到弹出窗口。这就是我们将要讨论的弹出窗口过滤问题。

  由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。

相关文章

  • Asp.net中时间格式化的6种方法详细总结

    Asp.net中时间格式化的6种方法详细总结

    数据控件绑定时格式化日期方法/用DataBinder.Eval进行数据绑定时/直接用ToString方法转换日期显示格式/用String类转换日期显示格式等等,感兴趣的你了解下哦,或许对你学习时间格式化有所帮助
    2013-02-02
  • .NET与树莓派控制彩色灯带WS28XX的实现

    .NET与树莓派控制彩色灯带WS28XX的实现

    这篇文章主要为大家介绍了.NET与树莓派控制彩色灯带WS28XX的实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • asp.net部署到IIS常见问题的解决方法

    asp.net部署到IIS常见问题的解决方法

    这篇文章主要为大家详细介绍了asp.net部署到IIS常见问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • ASP.NET Web API如何将注释自动生成帮助文档

    ASP.NET Web API如何将注释自动生成帮助文档

    本篇文章主要介绍了ASP.NET Web API从注释自动生成帮助文档的方法,功能很是强大,现与大家分享一下,需要的朋友可以参考下
    2015-07-07
  • ASP.NET Core中使用LazyCache的全过程

    ASP.NET Core中使用LazyCache的全过程

    这篇文章主要给大家介绍了关于ASP.NET Core中使用LazyCache的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • .NET微信扫码支付接入(模式二-NATIVE)

    .NET微信扫码支付接入(模式二-NATIVE)

    这篇文章主要为大家详细介绍了.NET微信扫码支付接入的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • ASP.NET 用户多次登录的解决方法

    ASP.NET 用户多次登录的解决方法

    在web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话需要报错。
    2009-02-02
  • 创建第一个ASP.NET应用程序(第1节)

    创建第一个ASP.NET应用程序(第1节)

    本文通过创建第一个ASP.NET应用程序,了解.net代码后置技术以及事件驱动机制和web页面设计中的基本控件使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-08-08
  • asp.net代码中修改web.config节点的具体方法

    asp.net代码中修改web.config节点的具体方法

    在有些情况下,要在代码中读取一种全局变量,把这种全局变量放在web.config是一种常见的手段。
    2013-06-06
  • asp.net基于Web Service实现远程上传图片的方法

    asp.net基于Web Service实现远程上传图片的方法

    这篇文章主要介绍了asp.net基于Web Service实现远程上传图片的方法,涉及asp.net调用Web Service的文件流操作与文件传输实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12

最新评论