当前位置: 首页 > 编程日记 > 正文

ASP.NET弹出窗口技术之增加网站流量方法

作为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( 笔者使用的XX 作系统)中,IE窗口的类都为IEFrame。同时,由于Win2000是一个基于Unicode代码的XX 作系统,所以没有WorkerA类,而以WorkerW类取而代之。同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXPXX 作系统,所以不能针对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组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。

相关文章:

检查是否支持 SO_REUSEPORT

为什么80%的码农都做不了架构师?>>> int reuse_port(int sockfd) {#ifndef SO_REUSEPORT#define SO_REUSEPORT (15)#endifconst int on 1;return setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)); } 转载于:https://my.oschina.n…

nginx的tmp文件过大导致磁盘空间不足一例

个人微博:http://weibo.com/h2fly欢迎技术交流现象:8月23之后,时不时收到服务器的/usrused > 90%的报警排查:1、du发现磁盘/usr使用不大,而报警使用的df》明显是有文件删除了空间没释放。注:du和df的实现机制不同&a…

10年Java老兵宝藏资料,吐血奉献!

2021都说工作不好找,也对开发人员的要求变高。前段时间自己有整理了一些Java后端开发面试常问的高频考点问题做成一份PDF文档(1000道高频题),同时也整理一些图文解析及笔记,今天在这免费分享给大家,希望大家…

IOCP , kqueue , epoll ... 有多重要?

原文地址:http://blog.codingnow.com/2006/04/iocp_kqueue_epoll.html设计 mmo 服务器,我听过许多老生常谈,说起处理大量连接时, select 是多么低效。我们应该换用 iocp (windows), kqueue(freebsd), 或是 epoll(linux) 。的确&am…

[故障解决]图文:python启动报错:api-ms-win-crt-runtime-l1-1-0.dll丢失解决

python启动报错:api-ms-win-crt-runtime-l1-1-0.dll丢失解决 环境 Windows 7 SP1 x64python3.6.1报错 解决办法 1.下载VC redist(安装时读条卡在:正在处理:Windows7_MSU_x64)2.到C:\ProgramData\Package Cache\里面搜索&#xff0…

ASP.NET设计应用程序的七大绝招

随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需求&#…

Chromium之各国语言切换

在\src\build\Debug\locales\目录下存放着各国语言所需要的资源文件xx.pak,我这边共有53中语言支持。 命令行进入src\build\Debug目录,敲:chrome.exe --langzh-CN就能用中文简体,zh-CN可以根据需要换成各种语言版本。 Chrome的整个solution中,每种语言都会有个相应的…

程序员每天工作摸鱼俩小时,月薪35K?

职场上有很多奇奇怪怪的事。比如说有人爆肝996,工资却还养不活自己。有人每天工作摸鱼,但是却月薪数万。前端时间,小编在某职场社交平台上看到这么一则帖子#程序员摸鱼2小时月入35k#仔细看下,该员工每天的工作日常就是摸鱼的间隙工…

JAVA的get post 区别

1. get 是从服务器上获取数据,post 是向服务器传送数据。 get 请求返回 request - URI 所指出的任意信息。Post 请求用来发送电子邮件、新闻或发送能由交互用户填写的表格。这是唯一需要在请求中发送body的请求。使用Post请求时需要在报文首部 Content - Length 字段…

多些时间能少写些代码(转自酷壳 – CoolShell.cn)

我在我的微博上说过这样一段话,我想在这里把我的这个观点阐述地更完整一些。左耳朵耗子:聪明的程序员使用50%-70%的时间用来思考,尝试和权衡各种设计和实现,而用30% – 50%的时间是在忙碌着编码,调试和测试。聪明的老板…

HTTP协议之Chunked解析

在网上找了好一会,始终没发现有解析Chunked编码的文章,那就自己写一个吧,呵呵。网上使用Chunked编码的网站似乎并不是很多,除了那些使用GZip压缩的网站,例:google.com,还有就是大部分打开GZip压…

关于深度学习编译器,这些知识你需要知道

作者 | 小O妹出品 | AI科技大本营(ID:rgznai100)神经网络编译器概览近年来,以机器学习、深度学习为核心的AI技术得到迅猛发展,深度神经网络在各行各业得到广泛应用: 1. CV(计算机视觉)&#xf…

checkbox点击切换选中状态

2019独角兽企业重金招聘Python工程师标准>>> function cboxChecked(ele) {$(ele).click(function () {var isChecked $(ele).attr(checked);if (!isChecked) {$(ele).attr(checked, true)} else {$(ele).attr(checked, false)}})} 转载于:https://my.oschina.net/u…

提升Hadoop计算能力的并行框架

集算器是新型并行计算框架,它支持读写HDFS中的文件,可以通过并行框架将计算任务分担到多个节点中。它专注于加强Hadoop的计算能力,从而实现计算性能和开发效率更高的大数据应用。更强的计算能力。Hadoop所使用的计算语言为JAVA,JA…

在ASP.NET 2.0中建立站点导航层次

站点导航提供程序--ASP.NET 2.0中的站点导航提供程序暴露了应用程序中的页面的导航信息,它允许你单独地定义站点的结构,而不用考虑页面的实际物理布局。默认的站点导航提供程序是基于XML的,但是你也可以通过编写自定义的提供程序,…

加速数据中心变革,Xilinx推出软件定义、硬件加速型 Alveo SmartNIC

近日,为满足现代数据中心发展需求,赛灵思公司宣布推出一系列全新数据中心产品及解决方案,包括全新 Alveo SmartNIC 系列、smart world (智能世界) AI 视频分析应用、一款能够实现亚微秒级交易的加速算法交易参考设计&a…

跟阿里云技术专家阙寒一起深度了解视频直播CDN技术

网络直播平台现下已经十分火热,很多常见的直播平台都采用了阿里云直播CDN来搭建自身业务。今天,我们请来了阿里云CDN团队技术专家阙寒,来介绍下视频的一些基础知识和视频直播的架构。在进入正题之前,我们先来了解视频直播相关的名…

一个ASP.NET中使用的MessageBox类

/// <summary>/// 自定义信息对话框/// </summary>public class MessageBox{/// <summary>/// 定义一个web页面&#xff0c;用来显示用户自定错误提示信息/// </summary>System.Web.UI.Page p;/// <summary>/// 实例时&#xff0c;参数为:this 如…

Ubuntu 13.10 安装Terminalx 后更改默认终端设置

1、安装 terminalx&#xff0c; sudo apt-get install terminator 2、Ctrl Alt t 试一下打开什么终端&#xff0c;我的默认启动的是Terminator;如果想换换默认的终端&#xff0c;还需以下一步 3、接下来&#xff0c;安装dconf-tools&#xff0c;这个是设置默认终端的必须 打开…

360数科张家兴:如何突破三大瓶颈,破解金融科技发展难题?

3月6日&#xff0c;上海香港联会、普陀香港联会联合普陀新区联会&#xff0c;IFTA亚洲金融科技师学会共同举办了“沪港合作共创未来”——沪港两地金融科技线上论坛。本次活动通过沪港两地直播连线&#xff0c;探讨两地金融科技领域的发展机遇。麻省理工学院香港创坊执行董事冼…

通过改进算法来优化程序性能的真实案例(Ransac)

对于运行不了几次&#xff0c;一次运行不了多久的方法&#xff0c;我们不需要考虑性能优化&#xff0c;对于那些需要经常运行几百次几千次的方法&#xff0c;我们头脑里还是要有性能这根弦。C#太优雅方便了&#xff0c;以至于很多人写程序时根本就把性能抛到脑后了&#xff0c;…

ASP.NET中使用MD5和SHA1算法加密

你的主页或者你管理的网站有各种密码需要保护&#xff0c;把密码直接放在数据库或者文件中存在不少安全隐患&#xff0c;所以密码加密后存储是最常见的做法。在ASP.NET中实现加密非常容易。.NET SDK中提供了CookieAuthentication类&#xff0c;其中的HashPasswordForStoringInC…

不追逐标准化产品,360数科的一站式风控体系有何不同?

新冠肺炎疫情无疑加速了金融行业数字化转型&#xff0c;竞争者不断涌入&#xff0c;逐渐形成由BATJ、传统银行旗下金融科技子公司、以及专注于金融机构的数字化服务公司构成的竞争格局。然而&#xff0c;风控始终是金融行业的核心。作为定位于中国零售金融领域科技服务商的360数…

基于Bootstrap里面的Button dropdown打造自定义select

最近工作非常的忙&#xff0c;在对一个系统进行改版。项目后台是MVC1.0开发的&#xff0c;但是前端部分已经改过几个版本&#xff0c;而已之前的设计师很强大&#xff0c;又做设计又做前端开发。而已很时尚和前沿&#xff0c;使用了一直都很热门的Bootstrap工具包&#xff0c;有…

HybridDB · 源码分析 · MemoryContext 内存管理和内存异常分析

背景 最近排查和解决了几处 HybridDB for PostgreSQL 内存泄漏的BUG。觉得有一定通用性。 这期分享给大家一些实现细节和小技巧。 阿里云上的 HybridDB for PostgreSQL 是基于 PostgreSQL 开发&#xff0c;定位于 OLAP 场景的 MPP 架构数据库集群。它不少的内部机制沿用了 Post…

联合南京大学,爱奇艺智能论文入选顶会CVPR 2021

日前&#xff0c;全球计算机视觉顶级会议CVPR (IEEE Conference on Computer Vision and Pattern Recognition)公布了2021年论文接收结果。作为计算机视觉领域世界三大顶会(CVPR、ICCV、ECCV)之一&#xff0c;CVPR的论文投稿量近五年来持续大涨。据CVPR官网显示&#xff0c;今…

Forefront_TMG_2010-TMG发布Web服务器

1.环境拓扑图&#xff1a;2.准备DMZ区域的Web服务器&#xff1a;安装Web服务器&#xff1a;在DMZ区域的Web服务器进行测试&#xff1a;3.TMG发布Web服务器&#xff1a;打开TMG管理控制台&#xff0c;新建“网站发布规则”&#xff1a;新建名称&#xff1a;选择“允许”&#xf…

ASP.NET实现身份模拟

使用模拟时&#xff0c;ASP.NET 应用程序可以选择以这些应用程序当前正为之操作的客户的身份执行。通常这样做的原因是为了避免在 ASP.NET 应用程序代码中处理身份验证和授权问题。而您依赖于 Microsoft Internet 信息服务 (IIS) 来验证用户&#xff0c;然后将已通过验证的标记…

Mac homebrew类似apt-get命令安装包

INSTALL brew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 其它&#xff1a; 其他brew命令 brew list 列出已安装的软件 brew update 更新brew brew home 用浏览器打开brew的官方网站 brew inf…

asp.net中长内容自动分页的实现

在一篇文章过长时,可以自动的写个小程序对其进行分页.具体代码:public class t3 : System.Web.UI.Page { private string str;//字符 private int strl;//字符总长度 private int pagesize;//每页显示的字符数 …