??xml version="1.0" encoding="utf-8" standalone="yes"?>
定义 DotNetKB 自定?IIS 用户帐户
保证 Web 应用E序安全性的最安全的方法是定义一个权限有限的自定义用P然后?IIS q行配置Q之能够在执行您的 Web 应用E序时能作ؓ自定义用戯行。这是相当容易实现的Q可以确保访问您?Web 应用E序的每个访问者都只具有您希望他们h的权限?
W一步是生成一个新?Windows 用户Q本例中UCؓ DotNetKBQ,为其讄一个增强型密码Q然后将其添加到 Windows 来宾l?(Guest Windows Group) 中。同Ӟ保选中 Password never expiresQ密码永不过期)?User cannot change passwordQ用户不能更改密码)复选框。这样将生成一个权限有限的用户Q在 IIS 中运行您?Web 应用E序Ӟ您可以将其用作标识(参见?7Q?
?7Q生成的权限有限的用?/center>
然后Q调?Internet 信息服务器管理员q择承蝲q些|页?Web 应用E序。在本例中,您可以选择承蝲前文所生成的测试页?Web 应用E序 (DotNetKB_WebSite)。在树视图中?Web 应用E序上单击鼠标右键,然后从上下文相关菜单中选择 Properties...Q属?..Q。然后选择 Directory SecurityQ目录安全性)q单击该对话?Anonymous access and authentication controlQ匿名访问和验证控制Q部分中?EditQ编辑)按钮。最后,输入自定义用户名 (DotNetKB)Q取消选择 Allow IIS to control passwordQ允?IIS 控制密码Q复选框Qƈ输入该自定义用户帐户的密码。完成所有这些工作之后,单击 OKQ确定)按钮Q将q些更改保存?IIS 配置数据库中Q参见图 8Q?
?8QAuthentication MethodsQ验证方法)对话?/center>
此时QIIS 在一个权限有限的自定义帐户下q行。Q何访问者访问您应用E序的网|Q都以q个自定义用戯n份运行,且只h该自定义用户的验证权限?
授权 DotNetKB 用户帐户讉K SQL Server
然后Q您需要ؓ该自定义用户授予讉K数据?(DotNetKB) 的相应权限。ؓ此,您可以?Microsoft SQL Server 企业理器或~写一个自定义脚本Q以创徏一个这L用户q授予其讉K特定对象的权限。本文介l如何?SQL Server 企业理器完成此操作?
注意Q?/b>管 Visual Studio .NET 2003 h?SQL Server 兼容的许多强大的集成功能Q但也不允许?Visual Studio .NET 2003 中轻杄理用户和用户权限。在大型的组l和团队中,q些高d通常由数据库理员完成?
因此Q启?SQL Server 企业理器之后,您可以按照以下步骤将自定义用?(DotNetKB) d数据库中Q参见图 9Q:
·在左侧的树视图中Q展开节点以显C?DotNetKB 数据库。在我的计算ZQ树视图的结构如下:Console Root | SQL Server Group | (LOCAL) (Windows NT) | Databases | DotNetKB?br />·然后Q在数据库下?UsersQ用P节点上单击鼠标右键,q择 New Database User...Q新建数据库用户...Q。显C?Database User Properties - New UserQ数据库用户属?- 新徏用户Q对话框Ӟ?Login nameQ登录名Q下拉框中选择
?9Q在数据库中d自定义用?
然后Q您需要ؓ DotNetKB 数据库中的所有存储过E和自定义函数添加执行权限。ؓ此,您只需?publicQ公共)角色授予权限。您可以权限授?DotNetKB 用户Q这样将使以后的dQ当q些用户获得讉K DotNetKB 的权限时Q更Ҏ执行存储q程Q而不需要ؓ每个用户d新的权限?
下面是ؓ DotNetKB 数据库中的存储过E和函数授予执行权限的步骤:
·H出昄树视图中 DotNetKB 数据库下?UsersQ用P节点Q以昄此数据库的用户列表。找?DotNetKB 用户q在其上双击Q打开 Database Users PropertiesQ数据库用户属性)对话框?br />·H出昄Q选中QpublicQ公共)角色Ӟ单击 Properties...Q属?..Q按钮,打开 Database Role PropertiesQ数据库角色属性)对话框。然后单?Permissions...Q权?..Q按钮,昄数据库对象和权限讄列表?br />·选中对话框顶?Database roleQ数据库角色Q下拉列表中?publicQ公共)角色之后Q找Cؓ此数据库定义的所有存储过E和自定义函敎ͼ可能需要展开对话框才能看到全名)Qƈ保选中各项旁边?EXECUTEQ执行)复选框。您可能会发现某些系l对象的其他一些复选框也被选中了,请不要更改这些选项?br />·最后,讄所有的 EXECUTEQ执行)权限后,单击 OKQ确定)按钮Q保存更改ƈ关闭对话框。依ơ单?OKQ确定)按钮Q直到所有对话框均被关闭?
xQ您已ؓ IIS 创徏了自定义用户Qƈ讄了该用户?SQL Server 中的相应权限。现在,您需要在 ASP.NET Web 目中进行一个配|更改,保 ASP.NET 使用同一个用户帐h行对 SQL Server 的所有调用?
讄您的 ASP.NET 应用E序以模?DotNetKB 用户
?IIS 下运行的 ASP.NET Web 应用E序生成坚实可靠的配|的最后一个步骤是Q配|?ASP.NET Web 应用E序Q之能够接受来?IIS ?Windows 用户标识q能用于讉K其他操作pȝ资源。ؓ此,您只需?web.config Ҏ件中输入一行代码?
修改后的 web.config 文g如下所C:
h意,您只需d
xQ您已生成了自定义用Pqؓ其设|了讉K SQL Server ?IIS 的相应权限。在下一《创?ASP.NET 试c中Q我们来创徏一些测试页Q确保它能够正常工作。从q里您可以看Z切正常?img height="1" src="http://www.pcbookcn.com/down_info.asp?id=2390" width="1" border="0" />
]]>
我心飞扬
写这文章的动机是看C大家对VBScript和Javascript的讨Z及另一片类似的文章Q觉得有必要大家的x加以整理:-)Qƈ我在工作中产生的一些心得拿出来和大家分享,希望对大家有所帮助。当Ӟ水^有限Q错误在所隑օ?br />
Active Server Pages是Microsoft Windows DNA的重要组成部分,使用ASP我们可以很容易的构造功能强大的ZWeb的应用。有很多脚本~写语言可供我们q行ASP创作Q如QVBScript、JavaScript、Perl 和Rexx{,你可以从几种脚本~写语言中选择一个。本文中我们讨论微Y公司所提供的两U脚本编写语aQ?
VBScript
JScript
首先Q我惌论的是:
一、什么时候用VBScript 和JScriptQ以及两者之间的区别
VBScript 是Visual Basic的子集,全称是Microsoft Visual Basic Scripting Edition。如果你曄用过Visual Basic或者是Visual Basic for Applications (VBA)Q你׃觉得非常熟悉。不q它们ƈ不完全一P因ؓVBScript是特意ؓ在WEB中进行工作而设计的?br />
JScript是ECMAScript的Microsoft版本Q是一l包括JScript 和JavaScript脚本~写语言的标准定义。JScript从一l编E语a如C, C++, 以及Java{之中脱d来的。如果你以前曄用过C或者是JavaQ那么JScript的结构你会觉得非常熟悉。即便你不知道这些语a也没有关p,JScript的结构一点也不难Q它像C和Java一h便而没有它们那么复杂?br />
微Y公司在Internet Explorer和Internet Information Server (IIS)中ؓ它们提供了ActiveX Scripting LanguageQActiveX脚本~辑语言Q引?比如vbscript.dll、jscript.dll)?br />
那么Q什么时候选择何种语言Q?br />我们知道Q进行ASP开发无外乎要编写下列两U脚本之一Q?br />
1)服务器脚本:
在ASP面中ؓIIS~写服务器脚本,无论使用那种语言都没有问题。ƈ且微软公司的Visual InterDev对它们支持的都很好?br />
2)客户端脚本:
如果你想在浏览器脚本中用VBScriptQ那么浏览器必须是Internet Explorer的某个版本。因为其他浏览器可能不支持VBScript。如果要建立一个公共Web站点Q你无法预知用户使用的是什么浏览器Q那么VBScript只能用于Internet Explorerq个限制成问题了?br />几乎所有允许编写脚本的览器都支持JScript。因此,如果Z个公共Web站点~写应用E序Q用JScript来编写客L脚本是很自然的选择?br />
影响你做军_的其他主要因素还有:
1、错误控?br />在VBScript中有On Error 错误陷阱来对错误情况q行控制Q如QOn Error Resume Next。如果你~写的是服务器脚本,错误控制非常重要Q因本的q行是无人照儡。Jscript没有q种机制?br />
2、格式化
VBScript有这L功能Q能够轻易地把数据,数字和货币数据格式化。JScript没有q样的功能?br />
3、动态执?br />JScript一个非常有力的Ҏ是Q它允许你在你的脚本内动态地建立和执行脚?eval()函数、execScript()Ҏ{?。简而言之,在你的脚本中能够~写脚本。当你用DHTMLq行工作Ӟq个Ҏ是非常有用的,因ؓq样你就能够动态的操作DHTML的文档模型了。VBScript无此功能。例如,在客L的Javascript里你可以使用cMq样的句法:
execScript("on error resume next:object.execWB 4, 1","VBScript");
4、面向对?br />JScript使用的是一U基于原型的对象l构Q允怽在脚本中定义对象。你能够往对象的原型中加入Ҏ和属性,扩展内置对象和定制对象。例如:
//自定义对象myObject
function myObject(){
//自定义属?br /> this.properties1=value; //此时赋gؓ该属性的默认?br /> this.properties2;
...
//自定义方?br /> this.myMethod1=Method1;
this.myMethod2=Method2;
}
function Method1(arg){
//block;
}
function Method2(arg){
//block;
}
其有用的是该对象可通过SOM传回客户端,使得ASP~程方式更象以往的C/Sl构。(我近期内可能会写一深入讨论SOM的文章,对该Ҏ作详l讨论)
5、事件控?br />用VBScript在Internet Explorer中控制事件很方便Q就像在Visual Basic中一栗在VBScript中也能够建立一个隐含的事g处理E序Q这只需要用对象事gl构形式来定义一功能就行了Q比如说隐式调用Button1_onclick。不q在Internet Explorer中,JScript没有q项功能Q但在其他的JScriptL上支持这功能)?br />在Internet Explorer 中用JScript控制事gQ会要求你链接到一个对象上Q而这个对象又是与事g处理E序相连的。通常Q只要在鉴别事gq且有处理程序功能的对象的标{栏中指明其属性即可。如下所C:
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
<!--
function button1_onclick() {
alert("button1 Clicked")
}
//-->
</SCRIPT>
<INPUT type="button" value="Button" id=button1 name=button1 LANGUAGE=javascript onclick="return button1_onclick()">
或者用类g面的语法:
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
<!--
function window_onload() {
//Block;
}
//-->
</SCRIPT>
<SCRIPT LANGUAGE=javascript FOR=window EVENT=onload>
<!--
window_onload()
//-->
</SCRIPT>
值得注意的是Q上例中LANGUAGE属性设|ؓ“Javascript”。Internet Explorer对于"JScript" ?Javascript"q两个名字都认识Q但许多其他览器却只认?Javascript"Q不认识"JScript" 。因此,Z保险赯Q如果你不能定该网|用Internet Explorer来浏览,最好用"Javascript"?br />6、数据类?br />VBScript和JScript的数据类型差别比较大QJScript?U数据类型:数值型、字W串型、对象型?br />布尔型、null和undefined。VBScript虽然只有一U数据类型VariantQ但其子cd比较丰富。特?br />是其Ҏ值类型的_划分使得在进行精的数D时昑־比较攑ֿ。且配合W?条中所讲到?br />格式化功能数据处理更加得心应手。有兌斚w的文档请参阅微Y的MSDN?br />
7、运符
在运符斚wVBScript和JScript也有一些差别:
例如QVBScript增加了用于字W串q接的算术运符?amp;”,用于对象比较的“is”运符{?br />然而JScript提供了比VBScript多得多的q算W,例如递加递减q算W?+?-”、一l位q算W?br />及typeof、delete{杂运符{。有x斚w的信息MSDN中非常详l,在此不必复述?br />
8、字W串处理
VBScript和Javascript的字W串处理曄也是|友们争论的焦点Q它们对字符串的处理有着本质
的不同,我之所以将q部分单独提出来Q也是想引发|友们作一些较l的讨论?br />在VBScript中字W串只是一U简单的数据cd而已QƈZ提供了非怸富的字符串处理函敎ͼ
例如Q?br />ASC,Chr,InStr,InStrRev,Join,LCase,UCase,Left,Right,Len,LTrim,RTrim,Trim,Mid,Replace,
Space,String,Split,StrComp,StrReverse
因此有很大一部分|友认ؓVBScript的字W串处理功能比JScript捗功能强大?br />
不过我不q么认ؓ。简h有可能的Q但谈到强大Q我觉得JScript功能更ؓ强大。在JScript中,
字符串不仅是一U数据类型,更是一cȝD的对象。作为对象的ҎQ他不仅提供了上q?br />VBScript中字W串函数的几乎所有功能,而且配合正则表达式能够提供更为强劲的功能?br />
一U典型的应用是字符串的模糊搜烦Q看下面q个例子Q?br />我想把一文章中的Chen0,Chen1,chenk,Chen99{可能的拼写Ҏ替换成JoyASP:
var txt = myTextFile.ReadAll();
var re = /chenk?\d?\d?/gi;
txt = txt.replace(re,"JoyASP");
q种用法在不能精地预知被处理的字符串时昑־其有用。熟悉Unix,C,C++,Perl的网友可?br />Ҏ则表辑ּ不会陌生Q关于这斚w的内容请查阅相关文章?br />
二、在同一个网中同时使用两种语言
在同一个网中可以使用不同的脚本编写语a。这样做有以下几个可能的原因Q?
A、在一个程序中充分利用各种语言的优炏V?
B、可能所面对的现有编码是用你不熟悉的语言来编写的。例如,DTC是用JScript~写的,?br />你熟悉的语言却是VBScript?br />大部分情况下Q你可以在同一个网中混合几种脚本语言q且它们怺之间能够配合得很好?br />用一U语a~写的脚本可以调用用另外一U语a~写的程序ƈ且能够共享全局变量。不q有?br />候还是会出现一点小问题Q现在就此说明一下?
1、当你从VBScript中调用一个JScript函数Ӟ注意在调用过E中要有括号Q即使这函C
要求讄参数也需如此。例如,一个调用应该像q样Q?br />
returnValue = call_JScript_Function()
如果你忘C加括P那么q个函数所q回的值就不是你所希望的|而是一个包含了函数?br />w的VBScript无法解释的对象?br />
2、服务器脚本的执行顺?br />?lt;% %>定界W括入的命o被称Z脚本命oQ主脚本命o按顺序运行,从头到尾。当Ӟ你可
以在一个服务器脚本中定义一个可调用的程序(函数或者是子程序)。这L话,如果需要就
可以随时调用它们?
所有的主脚本命令必ȝ同一U语a来编写,也就是在|页前面?lt;%@ LANGUAGE=xxxxx%>指示
中所指明的脚本语a。因此,在一个主脚本命o中你不能把几U脚本语a混合h?你也怼
说“等一{”。在理论上,把服务器脚本攑ֈ<script>单元中是l对可能的。就像下例一P
<%Response.Write("I Love joyASP!")%>
<SCRIPT language=VBScript RUNAT=Server>
Response.Write("I Love 我心飞扬, too.")
</SCRIPT>
但是Q这样你׃被IIS ASP处理E序的执行顺序控制。例如,如果你徏立了服务器脚本ƈ且在
IIS 4.0中运行它Q你会发现执行顺序可能是q样的:
1)非缺省语a?lt;SCRIPT>单元脚本
2)主脚本命?br />3)~省语言?lt;SCRIPT>单元脚本
以上的顺序在很大E度上依赖于ActiveX脚本语言引擎的蝲入顺序,同时IIS中的ASP处理E序?br />能在来会有所改变。因此,我不不大赞成按这U方式书写代码,你是只把<SCRIPT>单元
用于函数或者子E序Q或是把它仅仅用于其他与执行序无关的编码?br />
3、客L脚本块的序
当你在客L把几U语a混合使用Ӟ<SCRIPT>块在|页中出现的序非常重要Q有时候会?br />响到它们是否能正常工作。看看下面这个简单的例子Q它是在一个VBScript脚本中调用一个用
JScript~写的函敎ͼ
<SCRIPT LANGUAGE="VBScript">
' 调用一个JScript function
her = "Lucy"
loveher = JSfuncLoveher(her)
document.write("l密情报Q? & loveher)
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function JSfuncLoveher(arg){
return "White、飞鸟和Moslem都想? + her + "MM :-)";
}
</SCRIPT>
它不会vM作用。说得更明白一点,document.write()会往|页中写入一个空的字W串。ؓ
什么?很简单,在处理VBScript块时Q下面的Java Script <SCRIPT>块还没有被读出来Q没?br />q行语法分析Q因此网不能用它。当览器处理网中的脚本块Ӟ它是从上往下进行的?
在这个例子中Q只需要调换一下脚本块的顺序就能够解决q个问题了。不q,事实上这c问?br />q不那么常见Q在大多数情况下Q?lt;SCRIPT>中包含的函数和子E序只有当整个网被全部下蝲
下来q且所有的单元都可以用之后才能够被调用。不q,你还是要CQ网|按照一定的
序来处理的Q不同语a?lt;SCRIPT>块是分别处理的?
3、区分大写以及命名习惯
JScript是严格区别大写的:在每个JScript的关键字Q每个JScript命名I间的所有部分中Q?br />你可以把大写和小写字母恰当的l合h使用。这其中包括了你使用的对象模型中所有的关键
字。例如,当你使用ASP Response对象Ӟ必须正确C用大写字母(如Response.Write)Q?br />否则JScript会坚决不予承认。同P如果你ؓDHTML onclick事g~写一个处理程序,如果?br />在Visual Basic中经常发生的随便使用大小写的形式JScript可能׃会承认?br />
VBScript是不区分大写和小写字母的。在某种E度上,q种不计较大写的疏忽甚臛_你用
VBScript对JScript~写的单元进行访问时都没什么问题。下面例子中l出了两个脚本。第一
个是用JScript~写的,其中q包括了一个全局变量QctrQ和一个函敎ͼdoubleMeQ。第二个
脚本是用VBScript~写的,它是一个按钮处理程序,它能够调用JScript函数Qƈ且报告全局
变量的倹{?
<SCRIPT LANGUAGE=javascript>
var ctr;
function doubleMe(aNumber){
if(parseInt(ctr)){
ctr = ctr + 1;
}
else{
ctr = 1;
}
return aNumber * 2;
}
</SCRIPT>
<SCRIPT LANGUAGE="vbscript">
Function btn1_onclick()
numberToDouble = 12
msgbox "The doubled number = " & DOUBLEME(numberToDouble)
msgbox "You have doubled the number " & CTR & " times."
End function
</SCRIPT>
在VBScript脚本中,很明显,我在提到doubleMe 函数和ctr变量Ӟ没有正确使用字母的大?br />写,但是E序依然q行良好?q是一个好消息。而坏消息是Q在下面q些情况下你一定要?br />意字母的大小写:如果|页中的JavaScript脚本所包含的单元只能够通过字母的大写和写?br />区分Q例如,一个叫做Timer()的函数和一个叫做timer的全局变量{等。很不幸Q尽这U编
码方式不怎么好,但是有时候在你的|页中还是可能会遇到原来存在的~码?
在一个函数调用中把JScript单元的名字作Z个字W串参数来?br />
如果JScript包括的单元仅仅能够用字母的大写来区分,那么VBScript׃把它们看成一L
Q也是_不区分大写和写Q。VBScript只能看看不管大小写的区别Q它们是不是一P
因此它识别出的只有一个JScript单元。换一句话_如果VBScript首先扑ֈ的是叫做Timer()
的函敎ͼ那么它就无法扑ֈ叫做timer的全局变量了,反之也是一栗即便你在VBScript~码?br />十分注意的把它们做了区别l果也是一栗因为VBScript在处理这些名字的时候认为它们只有一
U写法。不q的是,q里没有其它的解x法,除非在JScript的代码中不利用这些大写之间
的微差别来区分不同的函数名U?
除了在某些特D的情况下,把单元名作ؓ参数使用q种问题q不常见。特D情况之一是在Visual
InterDev 6.0中的脚本对象模型中。下面我会把它作Z个例子来使用Q你可以把它看作是相?br />情况下的处理准则?
Visual InterDev 6.0的脚本对象模型都是用JScript来编写的。你也可以用VBScript来编写自?br />的编码,它能够与用VBScript区分大小写方式编写的脚本对象模型一起用。有时候,你不能够
直接调用某一ҎQ除非你把这个方法的名称传递到一个JScript函数中,而由函数来调用这?br />Ҏ?
一个典型的例子是警告ҎQ你可以用它把一个方法绑定到一个特D的事g上。在下面q个?br />子中Q一个按钮的onmouseover事g被绑定到changecaption()事g处理E序上?
<SCRIPT LANGUAGE="VBScript">
Function setAdviseMethods()
Btn1.advise("onmouseover", "changecaption()")
End Function
</SCRIPT>
因ؓ你把q些名字作ؓ字符串传送到一个JScript函数中,所以你必须使用正确的大写表示?br />JScript会自动用它的区分大小写的规则来检查这些名字,如果大小写不正确Q就会找不到它们?br />
4、从VBScript 往JScript中传送数l?br />有时候一个VBScriptE序会传送一个数l作为它的一个参敎ͼ或者作为它的返回倹{你可以从JScript
中调用这个程序,不过必须把VBScript数组转换成ؓ一个可用的JScript数组。你只要在JScript函数?br />建立一个VBArray对象q且用toArray把它转换成ؓ一个JScript数组可以了?br />
注意QJScript不支持多l数l,如果原来的VBScript数组是多l的Q经qtoArray的{换后它会成ؓ一
个一l的JScript数组?在下面的例子中有一个VBScript脚本Q它建立了一个数l,q有一个JScript
脚本Q它说明如何才能获得ƈ使用q个数组Q?br />
<SCRIPT LANGUAGE="VBSCRIPT">
Function makeArrayVB()
' 建立一?VBScript 数组
dim anArray(1,1)
anArray(0,0) = "0,0"
anArray(0,1) = "0,1"
anArray(1,0) = "1,0"
anArray(1,1) = "1,1"
makeArrayVB = anArray
End Function
<SCRIPT LANGUAGE="JavaScript">
// ?JScript 脚本中访?VBScript 数组
function getVBArray(){
var arrayObj;
var jsArray;
arrayObj = makeArrayVB();
jsArray = VBArray(arrayObj).toArray();
alert("VBScript array length = " + jsArray.length);
// 昄数组的内?br /> for(i=1;i<=jsArray.length;i++){
alert(jsArray[i-1]);
}
}
</SCRIPT>
不过Q在目前的VBScriptQ?.0Q中Q反q来是无法做到的。也是说你不能把一?JavaScript 数组转换?br />为VBScript数组。如果你非要在VBScriptE序中用JavaScript数组Q你可以用下面的做法Q?br />把JScript 数组转换成一U不同的l构Q如转换成一个由分隔W限制的字符串等Q这样VBScript p够
用了。例如,你可以用 toString 函数把一个数l{换成一个用逗号分隔的,无限制的字符丌Ӏ这P?
VBScript 中你p够用 Split 函数把它分成不同的单元。很明显q种Ҏ在很多时候ƈ不管用,不过有时
又的有效?br />
以上|里|唆的写了一大堆Q希望能对网友们有帮助,也希望就某些问题展开讨论?br />最后,网友们 Happy Scripting!!
]]>
首先,服务器端的组件要有别于客L的组?客户端的lg是通过|络传输,依靠HTML来v作用.而且只能在IE上有?但是服务器端的组件是q行在服务器?它在服务器上执行各种操作.因此,所有的览器都能n?它依靠的是服务器而不是浏览器.
当IIS被请求执行一个ASPE序,它首先会在ASP文g中找?Q? %>标签之间的代?q且执行?也可以是Qscript runat=server>Q?script>之间的代?.如果q个ASPE序在先前被调用q?那么它就会用内存中的~译q的E序来向用户q回HTML代码,如果没有,那么它就重新~译.q里ASP比CGI多一炚w度优势,因ؓCGI是每一个请求都使用一个线E?q样大大消耗了服务器的资源.
想不想你写的E序自己p在IISq行!?!现在你就行了!使用VB5(当然现在是VB6?,你就能徏立Dynamic Linked Libraries (DLL 文g),它能在IIS上直接运?如果有asp文g来请求的?.
pȝ和Y件的要求
你需要一?2位的操作pȝ来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在Windows95+PWS+VB5的环境下开发的.
我们开始吧
启动你的VB,选择ActiveX图标.q个图标可以在新建工E找?VB会提供一个默认的工程?project1)和类?class1).我们会将q两个名字都Ҏ.在改名之?请首先确认我们拥有Microsoft Active Server Pages Object Library,它在我们的程序非常有?从菜单中选择"工程",然后在其中选择"引用",׃出现"引用"H口从中选择Microsoft Active Server Pages Object Library.
l工E和cd?
现在我们来根据自q爱好来ؓproject1和class1来命名吧!l它们命名也是很重要?我们以后会用q个工程名和cd来创个组件的实例!后面详细介绍.
如何改名,我就不想多说?
我们的工E名改ؓExmaple,cd为Helloword
怎样使用工程和类
现在我们有了我们自己的工E?Example1)和类?HelloWorld).以后我们׃在ASP代码中用它们的名字来引用这个组?在ASP中我们就q样引用,如下: Set ObjReference = Server.CreateObject("ProjectName.ClassName")
对于我们工程的引用就? Set ObjReference = Server.CreateObject("Example1.HelloWorld")
现在我们p用ObjReference来调用我们在lg中所创徏的函?子程?下面我们会来写一个SayHello的子E序, 我们执行它的代码如下: Q?
Z在HellowordcM使用ASP的方?你必d此类中写一个OnStartPage
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>
子函?如下: Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
现在,无论什么时候用戯问一个带有本lg的ASP文g,IIS׃把ScriptingContext传送给我们的对象请我们使用.q个ScriptingContext包括了全部的ASPҎ和属?实现?q得我们有能力讉K所有ASP的对?看下面的代码:
Set MyScriptingContext = PassedScriptingContext
End Sub Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub
以后我们p用在VB中用MyApplication 来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在 OnStartPage之前来申明这些变? Private MyScriptingContext As ScriptingContext
使用ASP的对?
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session
我们的变量现在就能像标准的ASP对象来用了!比如,我们l常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功?代码如下:
用ASP中实? Q?
在VB中实?
MyTempVariable = Request.Form("userName")
Response.Write ("you entered "& MyTempVariable & "as your user name")
%> MyTempVariable = MyRequest.Form("userName")
通过使用MyResponse来代替Response,我们能够使用所有Response的方?当然,MyResponseq个名字可以随便来取,你甚臛_以就取Response.
MyResponse.Write ("you entered "& MyTempVariable & "as your user name")
]]>
目前QASP.NETq只能奔跑在微Y的Windows 2000、Windows XP和Windows 2003的系l中Qƈ且需要微软Internet Information Server(IIS)的支持,微Y原计划要让Windows NT4.0也支持ASP.NETQ但可能微Y是有些技术问题或市场考虑Q还没有实现NT下的ASP.NET的支持?
2、在一个ASPX文g中是否可以用一U以上的语言Q?
{案让你有点失望Q虽然微软的提供了公paq行环境QCLRQCommon Laguage RuntimeQ?实现了多U编E语a间的紧密集成Q可以允怽从一个VB对象中导出CQ所需的对象来Q但一个ASPX文g中只能用一U语aQ正如你不能在VB.NET中用C#的语法一栗?
3、ASPX文g的服务器端脚本支持那些语aQ?
目前QASPX文g只支持CQ、Visual Basic.NET、Jscript.NET和J#Q但是你使用code—behind(代码分离)的方法创Z个独立代码文Ӟ你就可以使用M.NET~译器支持的语言来实现功能了?
4、在Global.asax文g中能使用code—behindQ代码分)技术吗Q?
当然可以了,例如Q?
Global.asaxQ?
和用code—behindQ代码分)技?
Global.asaxQ? MyApp.vb:
5、我能否看到ASPX文g在ASP.NET中生成的代码吗?
Imports System.Web
Imports System.Web.SessionState
Public Class MyApp
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
Application("online_session") = 0
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
Application.Lock()
Application("online_session") = CInt(Application("online_session")) + 1
Application.UnLock()
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
Application.Lock()
Application("online_session") = CInt(Application("online_session")) - 1
Application.UnLock()
End Sub
End Class
可以看到的,当你的ASPX文g中包含命令或Web.config中声明了Ӟ你就可以在系l目录下的Microsoft.NET\Framework\v1.0.nnnn\Temporary ASP.NET Files中找到ASPX文g在ASP.NET下生成的文g?
6、在ASPX文g中如何注释呢Q?
同ASP文g中的Ҏ一栗?
7、ASPX文g中是否可以存在一个以上服务器?Form 标记Q?
不可?
8、我可以在WebH体中用自定义数据cd?
可以Q你可以把包含自定义数据cd的DLL文g攑֜E序根目录下的BIN目录中,ASP.NET会在数据cd引用Ӟ装蝲DLL文g的?
9、我能在Global.asax文g中触发那些事Ӟ
Application对象创徏和结束时所触发的事件有
?Application_Start
?Application_End
Session对象创徏和结束时所触发的事件有
?Session_Start
?Session_End
对程序有h发生时触发的事g?(按发生顺序排? ?Application_BeginRequest
当有E序有错误发生时触发的事件有
?Application_AuthenticateRequest
?Application_AuthorizeRequest
?Application_ResolveRequestCache
?Application_AcquireRequestState
?Application_PreRequestHandlerExecute
?Application_PostRequestHandlerExecute
?Application_ReleaseRequestState
?Application_UpdateRequestCache
?Application_EndRequest
?Application_Error
?Application_Disposed
10、Web控g是否支持样式表(CSSQ呢Q? Yes. All Web controls inherit a property named CssClass from the base class System.Web.UI.WebControls.WebControl. The following example defines a CSS class named Input and uses it to modify a TextBox control to display text in red 10-point Verdana type:
支持Q所有的Web控g都从基类System.Web.UI.WebControls.WebControl中承了一个叫做CssClass的属性?
例如Q? Qhtml>
11、在ASPX文g中默认导入那些名U空_
Qhead>
Qstyle>
.Input { font: 10pt verdana; color: red; }
Q?style>
Q?head>
Qbody>
Qform runat="server">
Qasp:TextBox CssClass="Input" RunAt="server" />
Q?form>
Q?body>
Q?html>
ASPX默认导入的名U空间可以直接引用了Q用其它的名称I间q自行导入了?
默认名称I间 ?System
12、我是否可以自己创徏服务器控件呢Q?
?System.Collections
?System.Collections.Specialized
?System.Configuration
?System.Text
?System.Text.RegularExpressions
?System.Web
?System.Web.Caching
?System.Web.Security
?System.Web.SessionState
?System.Web.UI
?System.Web.UI.HtmlControls
?System.Web.UI.WebControls
可以Q创作您自己?ASP.NET 服务器控件很Ҏ。创建简单的自定义控件时Q您所要做的只是定义从 System.Web.UI.Control z的类q写它?Render Ҏ。Render Ҏ采用 System.Web.UI.HtmlTextWriter cd的参数。控件要发送到客户端的 HTML 作ؓ字符串参C递到 HtmlTextWriter ?Write Ҏ?
例如Q?
服务器控件代码(单显C字W串Q:Simple.vbQ?Imports System
13、如何在ASP.NETE序中发送邮件呢Q?
Imports System.Web
Imports System.Web.UI
Namespace SimpleControlSamples
Public Class SimpleVB : Inherits Control
Protected Overrides Sub Render(Output As HtmlTextWriter)
Output.Write("QH2>Ƣ迎使用控g开发!Q?H2>")
End Sub
End Class
End Namespace
引用文gSimple.aspxQ?
Q?@ Register TagPrefix="SimpleControlSamples" Namespace="SimpleControlSamples" Assembly="SimpleControlSamplesVB" %>
Qhtml>
Qbody>
Qform method="POST" action="Simple.aspx" runat=server>
QSimpleControlSamples:SimpleVB id="MyControl" runat=server/>
Q?form>
Q?body>
Q?html>
在ASP.NETE序中发送邮件不再象ASP中那样需要组件的支持了,?NET的框架基cȝSystem.Web.Mail名称I间内包含的MailMessage和SmtpMailcd以实现这个功能?
例如Q? Dim message As new Mail.MailMessage
14、我如何通过ADO.NETd数据库中的图片ƈ昄它呢Q?
message.From = "web3@163.com"
message.To = "web3@163.com"
message.Subject = "试"
message.Body = "内容"
Mail.SmtpMail.SmtpServer = "localhost"
Mail.SmtpMail.Send(message)
下面举一个从Microsoft SQL Server的PUB数据库读取图片ƈ昄它的例子Q?
下面举一个从Microsoft SQL Server的PUB数据库读取图片ƈ昄它的例子Q?Q?@ Import Namespace="System.Data.SqlClient" %>
Q?@ Import Namespace="System.Drawing" %>
Q?@ Import Namespace="System.Drawing.Imaging" %>
Q?@ Import Namespace="System.IO" %>
Qscript language="VB" runat="server">
Sub Page_load(Sender as Object, E as EventArgs)
dim stream as new MemoryStream
dim connection as SqlConnection
connection=new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=")
try
connection.Open()
dim command as SqlCommand
command = new SqlCommand ("select logo from pub_info where pub_id='0736'", connection)
dim image as byte()
image = command.ExecuteScalar ()
stream.Write (image, 0, image.Length)
dim imgbitmap as bitmap
imgbitmap = new Bitmap (stream)
Response.ContentType = "image/gif"
imgbitmap.Save (Response.OutputStream, ImageFormat.Gif)
Finally
connection.Close()
stream.Clse()
End Try
End Sub
Q?script>
新技术应该有新技术的做法, q入ASP.NET的世? 应该把以往的习惯改? 全新的进入新的世?
以下列D的都是错误的做法, 请不要误以ؓ是推荐的做法而进行推q?
1. 使用server side includelASPX引入共同的页面构?
在ASP.NET的机制下, 应用ASCX(web user control)来实? ASCX提供了更多可控制接口. q且更重要的? ASCX是一个类. 一个实实在在的c? 可以全面控制?
2.不用web.config
web.config提供了非怸富的配置理接口. 是一个应用程序最核心的部? 但是很多人的web.config往往是空? 或者就从来没有修改q?
3.使用Response.Write向前端输出消?
ASP.NETq_下的Response和ASP的Response有很大的不同. 虽然表示同一含义, 但用法上已经大不相同. Response.Write的内容只会输出到늚最前端. 向前端输出消息的正确Ҏ是用PlaceHolder.
4.使用一pdsession理用户q接状?
q种Ҏ在ASP里被滥用. 在ASP.NET环境? 正确的做法应该是设计一个类. l构化地保存数据. 对session或者cookie的访问封装v?
5.使用session验证w䆾
q几乎是通病. ASP.NET提供了一l用于用戯n份验证的API. cd是forms验证或者windows验证. q一点quick start有一节讲解得很清? 可以l大部分是依靠给session赋值来保持用户w䆾验证状?
6.使用Response.Redirect重定向页
q一点在必要的时候可以? 但不可滥? 事实证明滥用重定向将D逻辑上的严重混ؕ. q是在以ؓE序单元的时候的做法. 使用front controller模式用户的操作逻辑集中h]
7.使用太多ASPX?
ASP环境下的E序单元只有*.asp? ASP.NET可不是这? q有后端的类? ASCX{等. 应将业务逻辑分别集中在不同的单元, 而不应该一Ҏ作用一个ASPX. 更多时候ASPX做为ASCX或者custom control的容器而管理页内逻辑. ASPX重用ASCX的同? ASPX也做为统一的页构图重用.
8.在多个逻辑单元之间复制代码q修改相应逻辑
重用. 重用. 重用. 处理此类问题的原则是不出CQ何相同或怼的过E? 如果你用上面的方? 一旦出现重大逻辑更改, 带来的结果将是灾难性的.
9.x用DataSet.
很多DataSet吓坏? 认ؓ”肯定”媄响性能. 但连最初的试都不? 他们总认Z们的产品一定重? 设计上应该”慎重? 他们往往使用ArrayList或者设计低U的cL保存集合数据. q行艰难的数据倒入工作.
10.对“性能”过多注?
对ASP.NET ViewState的机制特别不? 或者L挖空心思迫害h? 反倒把自己弄得很篏. 如果在对付ViewState的同时多注意连几次数据库也许更文明?
11.应用E序根目录很?
ASP.NET是开发项? 不是|站. 应该把不同的资源分类攄. 例如把所有静态资?样式? 脚本, 囑փ)l织C? 甚至可以写一lAPI来管理他? ASPX应该攑֜一? ASCX应该攑֜一? .*.cs? 应该把他们放到另外一个project?
12.不厌其烦的写讉K数据库的q程
应该把这工作交给DataAccess Application Block. 你自p要开关connection, 何苦?
13.自己写的东西最靠得?
事实往往正好相反. 多注意用h家写好的产品. 又不收你? 何苦那么爱面子呢.
14. 胡ؕ命名ASPX文g?
q是最让h痛苦的了. ASPX文g名不仅需要容易识? q应该遵循一定规? 因ؓbehind每个ASPX都会有一个同名的c? 惌一? 多难? 另外大部分h不知道管理自q目的name space. 让h好像看到一本帐一?
15.从来不作l承或派?
一些具有相同行为的c? 应该从公q基类z出来. 实际意义? 我们的ASPX应该有一个基cPageBase. 因ؓL一些公qҎ需要抽象出?
16.零property
他们的类(ASPX所对应)里只有private method. 不公开自己的Q何秘? 可以q一定是JAVA的遗老干的事.
17. 零ASCX
不用? 他还没学会ASP.NET
18.使用DreamWeaver“画“ASPX
q批人是工. 甚至有一些h在非帔R醉地讨论如何更好地“整合?DreamWeaver和Visual Studio.
19.只熟悉System.Web.UI.WebControl和System.Data.SqlClient应该q有一些值得熟悉的类?
20.零注?
q些都是心里很明白的快手. 一任IDE生成的缺省注释横在那里不?
21.零事?
对“事仉动“一无所? 只知道在Page_Load()里写q程. 或者双M个按钮写Xxx_Clock()q程. 在他们的E序里看不到event和delegate
Qupload.htmQ:
Qhtml>
Qbody>
Qcenter>
Qform name="mainForm" enctype="multipart/form-data" action="process.asp" method=p
ost>
Qinputtype=filename=mefile>Qbr>
Qinputtype=submitname=okvalue="OK">
Q?form>
Q?center>
Q?body>
Q?html>
注意enctype="multipart/form-data"Q一定要在Form中有q个属性,否则Q将无法得到上传 Q?
response.buffer=true
formsize=request.totalbytes
formdata=request.binaryread(formsize)
bncrlf=chrB(13)&chrB(10)
divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(formdata,datastart,dataend)
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.Ma
pPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3
rec.addnew
rec("img").appendchunkmydata
rec.update
rec.close
setrec=nothing
setconnGraph=nothing
%>
好了Q这下我们就把上传来的图片保存到了名为images.mdb的数据库中了Q剩下的工作是?Q?
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.recordset")
strsql="selectimgfromimageswhereid="&trim(request("id"))
rec.openstrsql,connGraph,1,1
Response.ContentType="image/*"
Response.BinaryWriterec("img").getChunk(7500000)
rec.close
setrec=nothing
setconnGraph=nothing
%>
注意在输出到览器之前一定要指定Response.ContentType="image/*"Q?Q?# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%Q?/code>
应该如何改?
【格式化日期?br />
取出?一般是object((DateTime)objectFromDB).ToString("yyyy-MM-dd");
【日期的验证表达式?br />
A.以下正确的输入格式: [2004-2-29], [2004-02-29 10:29:39 pm], [2004/12/31]
^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[1-9])|(1[0-2]))\:([0-5][0-9])((\s)|(\:([0-5][0-9])\s))([AM|PM|am|pm]{2,2})))?$
B.以下正确的输入格式:[0001-12-31], [9999 09 30], [2002/03/03]
^\d{4}[\-\/\s]?((((0[13578])|(1[02]))[\-\/\s]?(([0-2][0-9])|(3[01])))|(((0[469])|(11))[\-\/\s]?(([0-2][0-9])|(30)))|(02[\-\/\s]?[0-2][0-9]))$
【大写转换?br />
HttpUtility.HtmlEncode(string);
HttpUtility.HtmlDecode(string)
19.如何讑֮全局变量
Global.asax?br />
Application_Start()事g?br />
dApplication[属性名] Q?xxx;
是你的全局变量
20.怎样作到HyperLinkColumn生成的连接后Q点击连接,打开新窗口?
HyperLinkColumn有个属性Target,器D|成"_blank"卛_.(Target="_blank")
【ASPNETMENU】点击菜单项弹出新窗?br />
在你的menuData.xml文g的菜单项中加入URLTarget="_blank"Q如Q?br />
Q?xml version="1.0" encoding="GB2312"?Q?br />QMenuData ImagesBaseURL="images/"Q?
QMenuGroupQ?br />QMenuItem Label="内参信息" URL="Infomation.aspx" Q?br />QMenuGroup ID="BBC"Q?br />QMenuItem Label="公告信息" URL="Infomation.aspx" URLTarget="_blank" LeftIcon="file.gif"/Q?br />QMenuItem Label="~制信息? URL="NewInfo.aspx" LeftIcon="file.gif" /Q?br />......
最好将你的aspnetmenu升?.2?br />
21.dDataGrid控gTextBox?br />
foreach(DataGrid dgi in yourDataGrid.Items)
{
TextBox tb = (TextBox)dgi.FindControl("yourTextBoxId");
tb.Text....
}
23.在DataGrid中有3个模板列包含Textbox分别?DG_ShuLiang (数量) DG_DanJian(单h) DG_JinE(金额)分别?.6.7列,要求在录入数量及单h的时候自动算出金额即:数量*单h=金额q要求录入时限制?数值型.我如何用客户端脚本实现这个功?
〖思归?br />
Qasp:TemplateColumn HeaderText="数量"Q?
QItemTemplateQ?br />Qasp:TextBox id="ShuLiang" runat=’server?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_ShuLiang")%Q?
onkeyup="javascript:DoCal()"
/Q?br />
Qasp:RegularExpressionValidator id="revS" runat="server" ControlToValidate="ShuLiang" ErrorMessage="must be integer" ValidationExpression="^\d+$" /Q?br />Q?ItemTemplateQ?br />Q?asp:TemplateColumnQ?br />
Qasp:TemplateColumn HeaderText="单h"Q?
QItemTemplateQ?br />Qasp:TextBox id="DanJian" runat=’server?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_DanJian")%Q?
onkeyup="javascript:DoCal()"
/Q?br />
Qasp:RegularExpressionValidator id="revS2" runat="server" ControlToValidate="DanJian" ErrorMessage="must be numeric" ValidationExpression="^\d+(\.\d*)?$" /Q?br />
Q?ItemTemplateQ?br />Q?asp:TemplateColumnQ?br />
Qasp:TemplateColumn HeaderText="金额"Q?
QItemTemplateQ?br />Qasp:TextBox id="JinE" runat=’server?Text=’<%# DataBinder.Eval(Container.DataItem,"DG_JinE")%Q?/Q?br />Q?ItemTemplateQ?br />Q?asp:TemplateColumnQ<script language="javascript"Q?br />function DoCal()
{
var e = event.srcElement;
var row = e.parentNode.parentNode;
var txts = row.all.tags("INPUT");
if (!txts.length || txts.length Q?3)
return;
var q = txts[txts.length-3].value;
var p = txts[txts.length-2].value;
if (isNaN(q) || isNaN(p))
return;
q = parseInt(q);
p = parseFloat(p);
txts[txts.length-1].value = (q * p).toFixed(2);
}
Q?scriptQ?br />24.datagrid选定比较底下的行ӞZ么Lh一下,然后滚动到了最上面Q刚才选定的行因屏q的关系q不到了?br />
page_load
page.smartNavigation=true
25.在Datagrid中修Ҏ据,当点ȝ辑键Ӟ数据出现在文本框中,怎么控制文本框的大小 ?
private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
for(int i=0;iQe.Item.Cells.Count-1;i++)
if(e.Item.ItemType==ListItemType.EditType)
{
e.Item.Cells[i].Attributes.Add("Width", "80px")
}
}
26.对话?br />
private static string ScriptBegin = "Qscript language=\"JavaScript\"Q?;
private static string ScriptEnd = "Q?scriptQ?;
public static void ConfirmMessageBox(string PageTarget,string Content)
{
string ConfirmContent="var retValue=window.confirm(?+Content+"?;"+"if(retValue){window.location=?+PageTarget+"?}";
ConfirmContent=ScriptBegin + ConfirmContent + ScriptEnd;
Page ParameterPage = (Page)System.Web.HttpContext.Current.Handler;
ParameterPage.RegisterStartupScript("confirm",ConfirmContent);
//Response.Write(strScript);
}
27. 时间格式化Qstring aa=DateTime.Now.ToString("yyyyqMM月dd?);
1.1 取当前年月日时分U?
currentTime=System.DateTime.Now;
1.2 取当前年
int q? DateTime.Now.Year;
1.3 取当前月
int ? DateTime.Now.Month;
1.4 取当前日
int ? DateTime.Now.Day;
1.5 取当前时
int ? DateTime.Now.Hour;
1.6 取当前分
int ? DateTime.Now.Minute;
1.7 取当前秒
int U? DateTime.Now.Second;
1.8 取当前毫U?
int 毫秒= DateTime.Now.Millisecond;
28Q自定义分页代码Q?br />
先定义变?Q?br />
public static int pageCount; //总页面数
public static int curPageIndex=1; //当前面
下一:
if(DataGrid1.CurrentPageIndex Q?(DataGrid1.PageCount - 1))
{
DataGrid1.CurrentPageIndex += 1;
curPageIndex+=1;
}
bind(); // DataGrid1数据l定函数
上一:
if(DataGrid1.CurrentPageIndex Q?)
{
DataGrid1.CurrentPageIndex += 1;
curPageIndex-=1;
}
bind(); // DataGrid1数据l定函数
直接面跌{Q?
int a=int.Parse(JumpPage.Value.Trim());//JumpPage.Value.Trim()转?
if(aQDataGrid1.PageCount)
{
this.DataGrid1.CurrentPageIndex=a;
}
bind();
29QDataGrid使用Q?/strong>
d删除认Q?
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
foreach(DataGridItem di in this.DataGrid1.Items)
{
if(di.ItemType==ListItemType.Item||di.ItemType==ListItemType.AlternatingItem)
{
((LinkButton)di.Cells[8].Controls[0]).Attributes.Add("onclick","return confirm(’确认删除此吗??;");
}
}
}
样式交替Q?
ListItemType itemType = e.Item.ItemType;
if (itemType == ListItemType.Item )
{
e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=?FFFFFF?";
e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=?d9ece1?cursor=’hand?" ;
}
else if( itemType == ListItemType.AlternatingItem)
{
e.Item.Attributes["onmouseout"] = "javascript:this.style.backgroundColor=?a0d7c4?";
e.Item.Attributes["onmouseover"] = "javascript:this.style.backgroundColor=?d9ece1?cursor=’hand?" ;
}
d一个编号列Q?
DataTable dt= c.ExecuteRtnTableForAccess(sqltxt); //执行sqlq回的DataTable
DataColumn dc=dt.Columns.Add("number",System.Type.GetType("System.String"));
for(int i=0;iQdt.Rows.Count;i++)
{
dt.Rows[i]["number"]=(i+1).ToString();
}
DataGrid1.DataSource=dt;
DataGrid1.DataBind();
DataGrid1中添加一个CheckBoxQ页面中d一个全选框
private void CheckBox2_CheckedChanged(object sender, System.EventArgs e)
{
foreach(DataGridItem thisitem in DataGrid1.Items)
{
((CheckBox)thisitem.Cells[0].Controls[1]).Checked=CheckBox2.Checked;
}
}
当前页面中DataGrid1昄的数据全部删?
foreach(DataGridItem thisitem in DataGrid1.Items)
{
if(((CheckBox)thisitem.Cells[0].Controls[1]).Checked)
{
string strloginid= DataGrid1.DataKeys[thisitem.ItemIndex].ToString();
Del (strloginid); //删除函数
}
}
30Q当文g在不同目录下Q需要获取数据库q接字符Ԍ如果q接字符串放在Web.configQ然后在Global.asax中初始化Q?/strong>
在Application_Start中添加以下代码:
Application["ConnStr"]=this.Context.Request.PhysicalApplicationPath+ConfigurationSettings.
AppSettings["ConnStr"].ToString();
31Q?变量.ToString()
字符型{?转ؓ字符?
12345.ToString("n"); //生成 12,345.00
12345.ToString("C"); //生成 K?2,345.00
12345.ToString("e"); //生成 1.234500e+004
12345.ToString("f4"); //生成 12345.0000
12345.ToString("x"); //生成 3039 (16q制)
12345.ToString("p"); //生成 1,234,500.00%
32、变?Substring(参数1,参数2);
截取字串的一部分Q参?为左起始位数Q参?为截取几位?如:string s1 = str.Substring(0,2);
33Q在自己的网站上登陆其他|站Q?如果你的面是通过嵌套方式的话Q因Z个页面只能有一个FORMQ这时可以导向另外一个页面再提交登陆信息)
QSCRIPT language="javascript"Q?
Q?--
function gook(pws)
{
frm.submit();
}
//--Q?
Q?SCRIPTQ?Qbody leftMargin="0" topMargin="0" onload="javascript:gook()" marginwidth="0" marginheight="0"Q?
Qform name="frm" action=" http://220.194.55.68:6080/login.php?retid=7259 " method="post"Q?
QtrQ?
QtdQ?br />Qinput id="f_user" type="hidden" size="1" name="f_user" runat="server"Q?br />Qinput id="f_domain" type="hidden" size="1" name="f_domain" runat="server"Q?br />Qinput class="box" id="f_pass" type="hidden" size="1" name="pwshow" runat="server"Q?
QINPUT id="lng" type="hidden" maxLength="20" size="1" value="5" name="lng"Q?br />QINPUT id="tem" type="hidden" size="1" value="2" name="tem"Q?
Q?tdQ?
Q?trQ?
Q?formQ?
文本框的名称必须是你要登陆的|页上的名称Q如果源码不行可以用vsniffer 看看?
下面是获取用戯入的登陆信息的代码:
string name;
name=Request.QueryString["EmailName"];
try
{
int a=name.IndexOf("@",0,name.Length);
f_user.Value=name.Substring(0,a);
f_domain.Value=name.Substring(a+1,name.Length-(a+1));
f_pass.Value=Request.QueryString["Psw"];
}
catch
{
Script.Alert("错误的邮?");
Server.Transfer("index.aspx");
}

]]>
response.write("QscriptQwindow.open(?.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"?Q?scriptQ?)
string a = Request.QueryString("id");
string b = Request.QueryString("id1");
Button1.Attributes.Add("onclick","return confirm(’确??");
button.attributes.add("onclick","if(confirm(’are you sure...??){return true;}else{return false;}")
int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()
private void DataGrid_ItemCreated(Object sender,DataGridItemEventArgs e)
{
switch(e.Item.ItemType)
{
case ListItemType.Item :
case ListItemType.AlternatingItem :
case ListItemType.EditItem:
TableCell myTableCell;
myTableCell = e.Item.Cells[14];
LinkButton myDeleteButton ;
myDeleteButton = (LinkButton)myTableCell.Controls[0];
myDeleteButton.Attributes.Add("onclick","return confirm(’您是否定要删除这条信息?;");
break;
default:
break;
}
}
private void grdCustomer_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
//点击表格打开
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
e.Item.Attributes.Add("onclick","window.open(’Default.aspx?id=" + e.Item.Cells[0].Text + "?;");
}
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
string OrderItemID =e.item.cells[1].Text;
...
e.item.Attributes.Add("ondblclick", "location.href=?./ShippedGrid.aspx?id=" + OrderItemID + "?);
}
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
string OrderItemID =e.item.cells[1].Text;
...
e.item.Attributes.Add("ondblclick", "open(?./ShippedGrid.aspx?id=" + OrderItemID + "?");
}
6.表格连接列传递参?br />
Qasp:HyperLinkColumn Target="_blank" headertext="ID? DataTextField="id" NavigateUrl="aaa.aspx?id=?br /> Q?# DataBinder.Eval(Container.DataItem, "数据字段1")%Q?& name=’<%# DataBinder.Eval(Container.DataItem, "数据字段2")%Q?/Q?/code>
7.表格点击改变颜色
if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onclick","this.style.backgroundColor=?99cc00?
this.style.color=’buttontext?this.style.cursor=’default?");
}
写在DataGrid的_ItemDataBound?br />
if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem)
{
e.Item.Attributes.Add("onmouseover","this.style.backgroundColor=?99cc00?
this.style.color=’buttontext?this.style.cursor=’default?");
e.Item.Attributes.Add("onmouseout","this.style.backgroundColor=’?this.style.color=’?");
}
8.关于日期格式
日期格式讑֮
DataFormatString="{0:yyyy-MM-dd}"
我觉得应该在itembound事g?br />
e.items.cell["你的?].text=DateTime.Parse(e.items.cell["你的?].text.ToString("yyyy-MM-dd"))
9.获取错误信息q到指定面
不要使用Response.Redirect,而应该用Server.Transfer
e.g
// in global.asax
protected void Application_Error(Object sender, EventArgs e) {
if (Server.GetLastError() is HttpUnhandledException)
Server.Transfer("MyErrorPage.aspx");
//其余的非HttpUnhandledException异常交给ASP.NET自己处理okay?:)
}
Redirect会导致postQback的生从而丢׃错误信息Q所以页面导向应该直接在服务器端执行Q这样就可以在错误处理页面得到出错信息ƈq行相应的处?
10.清空Cookie
Cookie.Expires=[DateTime];
Response.Cookies("UserName").Expires = 0
11.自定义异常处?br />
//自定义异常处理类
using System;
using System.Diagnostics;
namespace MyAppException
{
/// QsummaryQ?br /> /// 从系l异常类ApplicationExceptionl承的应用程序异常处理类?br /> /// 自动异常内容记录到Windows NT/2000的应用程序日?br /> /// Q?summaryQ?br /> public class AppException:System.ApplicationException
{
public AppException()
{
if (ApplicationConfiguration.EventLogEnabled)LogEvent("出现一个未知错误?);
}
public AppException(string message)
{
LogEvent(message);
}
public AppException(string message,Exception innerException)
{
LogEvent(message);
if (innerException != null)
{
LogEvent(innerException.Message);
}
}
//日志记录c?br /> using System;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
namespace MyEventLog
{
/// QsummaryQ?br /> /// 事g日志记录c,提供事g日志记录支持
/// QremarksQ?br /> /// 定义?个日志记录方?(error, warning, info, trace)
/// Q?remarksQ?br /> /// Q?summaryQ?br /> public class ApplicationLog
{
/// QsummaryQ?br /> /// 错误信息记录到Win2000/NT事g日志?br /> /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br /> /// Q?summaryQ?br /> public static void WriteError(String message)
{
WriteLog(TraceLevel.Error, message);
}
/// QsummaryQ?br /> /// 警告信息记录到Win2000/NT事g日志?br /> /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br /> /// Q?summaryQ?br /> public static void WriteWarning(String message)
{
WriteLog(TraceLevel.Warning, message);
}
/// QsummaryQ?br /> /// 提CZ息记录到Win2000/NT事g日志?br /> /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br /> /// Q?summaryQ?br /> public static void WriteInfo(String message)
{
WriteLog(TraceLevel.Info, message);
}
/// QsummaryQ?br /> /// 跟t信息记录到Win2000/NT事g日志?br /> /// Qparam name="message"Q需要记录的文本信息Q?paramQ?br /> /// Q?summaryQ?br /> public static void WriteTrace(String message)
{
WriteLog(TraceLevel.Verbose, message);
}
/// QsummaryQ?br /> /// 格式化记录到事g日志的文本信息格?br /> /// Qparam name="ex"Q需要格式化的异常对象</paramQ?br /> /// Qparam name="catchInfo"Q异怿息标题字W串.Q?paramQ?br /> /// QretvalueQ?br /> /// QparaQ格式后的异怿息字W串Q包括异常内容和跟踪堆栈.Q?paraQ?br /> /// Q?retvalueQ?br /> /// Q?summaryQ?br /> public static String FormatException(Exception ex, String catchInfo)
{
StringBuilder strBuilder = new StringBuilder();
if (catchInfo != String.Empty)
{
strBuilder.Append(catchInfo).Append("\r\n");
}
strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace);
return strBuilder.ToString();
}
/// QsummaryQ?br /> /// 实际事g日志写入Ҏ
/// Qparam name="level"Q要记录信息的别(error,warning,info,trace).Q?paramQ?br /> /// Qparam name="messageText"Q要记录的文?Q?paramQ?br /> /// Q?summaryQ?br /> private static void WriteLog(TraceLevel level, String messageText)
{
try
{
EventLogEntryType LogEntryType;
switch (level)
{
case TraceLevel.Error:
LogEntryType = EventLogEntryType.Error;
break;
case TraceLevel.Warning:
LogEntryType = EventLogEntryType.Warning;
break;
case TraceLevel.Info:
LogEntryType = EventLogEntryType.Information;
break;
case TraceLevel.Verbose:
LogEntryType = EventLogEntryType.SuccessAudit;
break;
default:
LogEntryType = EventLogEntryType.SuccessAudit;
break;
}
EventLog eventLog = new EventLog("Application", ApplicationConfiguration.EventLogMachineName, ApplicationConfiguration.EventLogSourceName );
//写入事g日志
eventLog.WriteEntry(messageText, LogEntryType);
}
catch {} //忽略M异常
}
} //class ApplicationLog
}
12.Panel 横向滚动Q纵向自动扩?br />
Qasp:panel style="overflow-x:scroll;overflow-y:auto;"Q</asp:panelQ?/code>
13.回R转换成Tab
Qscript language="javascript" for="document" event="onkeydown"Q?br /> if(event.keyCode==13 && event.srcElement.type!=’button?&& event.srcElement.type!=’submit?&& event.srcElement.type!=’reset?&& event.srcElement.type!=’?amp;& event.srcElement.type!=’textarea?;
event.keyCode=9;
Q?scriptQ?br />
onkeydown="if(event.keyCode==13) event.keyCode=9"
14.DataGridq接?br />
DataNavigateUrlField="字段? DataNavigateUrlFormatString="http://xx/inc/delete.aspx?ID={0}"
15.DataGrid行随鼠标变色
private void DGzf_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if (e.Item.ItemType!=ListItemType.Header)
{
e.Item.Attributes.Add( "onmouseout","this.style.backgroundColor=\""+e.Item.Style["BACKGROUND-COLOR"]+"\"");
e.Item.Attributes.Add( "onmouseover","this.style.backgroundColor=\""+ "#EFF3F7"+"\"");
}
}
16.模板?br />
QASP:TEMPLATECOLUMN visible="False" sortexpression="demo" headertext="ID"Q?br />QITEMTEMPLATEQ?br />QASP:LABEL text=’<%# DataBinder.Eval(Container.DataItem, "ArticleID")%Q?runat="server" width="80%" id="lblColumn" /Q?br />Q?ITEMTEMPLATEQ?br />Q?ASP:TEMPLATECOLUMNQ?br />
QASP:TEMPLATECOLUMN headertext="选中"Q?br />QHEADERSTYLE wrap="False" horizontalalign="Center"Q</HEADERSTYLEQ?br />QITEMTEMPLATEQ?br />QASP:CHECKBOX id="chkExport" runat="server" /Q?br />Q?ITEMTEMPLATEQ?br />QEDITITEMTEMPLATEQ?br />QASP:CHECKBOX id="chkExportON" runat="server" enabled="true" /Q?br />Q?EDITITEMTEMPLATEQ?br />Q?ASP:TEMPLATECOLUMNQ?/code>
后台代码
protected void CheckAll_CheckedChanged(object sender, System.EventArgs e)
{
//改变列的选定Q实现全选或全不选?br /> CheckBox chkExport ;
if( CheckAll.Checked)
{
foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
{
chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
chkExport.Checked = true;
}
}
else
{
foreach(DataGridItem oDataGridItem in MyDataGrid.Items)
{
chkExport = (CheckBox)oDataGridItem.FindControl("chkExport");
chkExport.Checked = false;
}
}
}
17.数字格式?br />
【<%#Container.DataItem("price")%Q的l果?00.0000Q怎样格式化ؓ500.00??br />
Q?#Container.DataItem("price","{0:K?,##0.00}")%Q?br />
int i=123456;
string s=i.ToString("###,###.00");

]]>
作ؓMicrosoft的最新徏立动态Web|站的工PASP.NET相对于ASP和JSP在改变原始的Web~程方式斚w有了长的长q。它的代码与面分离技术(CodeBehindQ以及完善的Web服务器控件ؓE序员提供了一个更加符合传l编E的Web服务器端开发方式。但Web~程q是有着与传l编E不相同的特点,q些特点军_了ASP.NET~程中必M一些特D的技巧来完成E序要求Q弹出窗口正是这cȝE方式的代表。相当多的编E书c对弹出H口采取~默或者一语带q,g看不q弹出窗口的巨大使用天地。本文将Z解开弹出H口使用中的大多数问题?/p>
Z提高|站的访问的q发度和吞吐量,与其它服务器脚本一PASP.NET同样使用了客L脚本来减L务器的压力。ASP.NET到现?1.1?为止q不直接支持弹出H口Q必通过JavaScriptQ或VBScriptQ来使用客户端弹出窗口?/p>
一?警告H口与在CodeBehind中用客L脚本的方?/p>
要在览器中弹出一个最单的警告H口Q可以用JavaScript语句Q?/p>
window.alert( [sMessage])
其中QsMessage是提CZ息。可惜,q样的弹出窗口是只有一个“确定”按钮,只能起到提示作用。如果我们要在删除记录时候弹Z个询问的弹出H口Q此时你需要用:
bConfirmed = window.confirm( [sMessage])
其中QbConfirmed是返回|sMessage是提CZ息。这个弹出窗口有两种选择Q“确定”或“放弃”,光择的返回值放在bConfirmed中,可供代码作出判断?/p>
Z提高代码的可重用性与可读性,应当使JavaScript与Codehind怺溶合。通常有两U方式可以达到这L效果?/p>
Q?Q?使用Response.WriteҎQ?/p>
使用Response.WriteҎ早在ASP时代已l被支持了。它可以把代码写到客LQ是一U相当方便且直观的方法。以下代码演CZ如何使用Response.WriteҎ来显CZ个警告信息?/p>
Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAlert.Click
’演CResponse.WriteҎ和alertH口?br /> Response.Write(" ")
End Sub
Q?Q?使用RegisterXXXҎ
如果你观察Response.Write的生成HTML代码Q你会发现Response.WriteҎ生成的代码是写到了HTML代码的最开始,x{之前。此Ӟ所有的 HTML对象都还没有生成Q如果要想用HTML内的对象Qƈ与之交互Q就会出现“找不到对象”的错误。因此,W者推荐一个更加符合CodeBehind方式的方?---使用RegisterXXXҎ。RegisterXXX包括QRegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数?/p>
RegisterStartupScript 的原型是Q?/p>
Overridable Public Sub RegisterStartupScript( _
ByVal key As String, _
ByVal script As String _
)
其中Qkey表示q个脚本的唯一标识Qscript是代表脚本的字符丌Ӏ?/p>
RegisterClientScriptBlock的原型与RegisterStartupScript相同Q两个函C同在于将其包含的脚本代码写入到HTML文g的不同位|。RegisterClientScriptBlock?Page 对象?元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象?元素的结束标C前发脚本。如果你的脚本有与页面对?doucument对象)q行交互的语句(q在我们后面的例子中看到Q,则推荐用RegisterStartupScriptQ反之如果要惛_L脚本可能早的执行,则可以用RegisterClientScriptBlock或Response.Write?/p>
Z防止在页面中反复加入脚本Q在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作ؓ注册的KeyQ然后在E序中可以用IsClientScriptBlockRegistered作判断?/p>
以下例子用RegisterClientScriptBlock来演Cconfirm的用方法?/p>
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConfirm.Click
’演CRegisterClientScriptBlockҎ和confirmH口
If (Not IsClientScriptBlockRegistered("clientScript")) Then
‘判断是否已l加入了该脚本,没有则加入?br /> Dim strScript As String
strScript = " "
‘注册脚?
RegisterClientScriptBlock("clientScript", strScript)
‘如果选择”否”,则l向下执行?br /> End If
End Sub
二?弹出指定面
光有提示H口q远q不能满x们的要求Q在E序中,我们常常需要弹出指定页面。此时可以用JavaScript的window.openҎ。配合前面的RegisterClientSciptBlockҎQ我们就可以实现指定面的弹出?/p>
以下代码展示了如何弹出指定页?
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
’用window.open与registerStartupScript单演C?/p>
If (Not IsClientScriptBlockRegistered("OpenScript")) Then
’判断是否已l加入了该脚本,没有则加入?br /> Dim strScript As String = " "
RegisterStartupScript("OpenScript", strScript)
End If
End Sub
E序使用Window.openҎ来弹出新的页面,它只一个参敎ͼ新的弹出H口的URL地址。事实在window.openҎ有多个参敎ͼ但这是javascipt的简单内容,我们不会在q儿详细分说。如果你有相关的问题Q请查询MSDN?/p>
q段E序在IE中直接用一切正常。但如果你正在用类如GoSurf、MyIE2、NetCapter之类的浏览器Q那么,很不q! 你将看不到弹出窗口。这是我们要讨论的弹出窗口过滤问题?/p>
三?非标准IE览器对弹出H口的过滤行?/p>
q告H口的泛滥得不网民不堪铺天盖地的q告骚扰UL攑ּ标准IE览器而用诸如GoSurf、MyIE2、NetCapterq样的用IE内核支持多页面ƈ能自动屏蔽广告的软g。据说在卛_发布的IE6 sp2中微软也加入封杀q告H口功能。这对大多数|民当然是g好事Q可对于E序员而言Q我们用弹出窗口的方式与一般广告ƈ无本质的不同Q这LH口也会被弹出窗口管理器不分青红皂白的封杀Q其l果当然是我们不愿看到的。有没有一个标准的方式能让H口正常的弹出呢Q这p求我们了解浏览器杀q告的原理。通常的广告封杀器用以下三U方式进行广告过滤:
Q?Q、基于窗口标题的杀方式
q种杀方式的原理是定时查所有的IEH口标题,然后于已l有的列表(q序维护的一个数l列表)来比?如果有相同的,我们关闭这个窗口。显Ӟq种方式有着诸多~陷Q它杀了所有的弹出的窗口,得太死Q在E序真正使用的很。不q,依据它进行的变Ş方式倒用得相当的普遍。那是Q基于窗口标题名U的qo技术,它根据弹出窗口的标题是否含有关于q告的关键字q行杀Q这为提高过滤效果作Z很好的探索?/p>
Q?Q、基于窗口类和位|的杀方式
l过分析发现正常览H口的类名是IEFRAME和CabinetWClass,而广告窗口的cd是CabinetWClass。进一步分析发玎ͼq告H口的WorkerAcdShell DocObject Viewcȝrect.top的值是相同的,正常IEH口的WorkerAcdShell DocObject Viewcȝrect.top的值是不相同的。根据以上两点就可以书写q告杀手程序了?事实上,我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现Q在Windows2000( W者用的操作pȝ)中,IEH口的类都ؓIEFrame。同Ӟ׃Win2000是一个基于Unicode代码的操作系l,所以没有WorkerAc,而以WorkerWcd而代之。同Ӟ也不存在rect.top不相同的情况Q由于笔者没有WindowsXP操作pȝQ所以不能针对WindowsXP作进一步的试验?/p>
Q?Q、基于IE COMlg的封杀方式
以上两种方式都是把IEH口当作一个普通的WindowsH口对待Q进行判断的。事实上QIE是一个典型的ZCOMlg的浏览器Q所有的ZIE内核的浏览器都是包装shdocvw.dll文gQ然后书写相应的BHO代码。只有这h能做到真正的控制IE览器,而不是方法一、二q样的隔靴搔痒?/p>
q有一U基于IE内核的弹出窗口封杀Ҏ。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事gQ执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)Ҏ。重载此ҎQ判断打开新窗口事件是否发生在览面已经下蝲完毕之后。如果是Q说明是正常的弹出窗口,反之加以拦截?/p>
׃Gosurfq样的浏览器本n重载了Shocvm.dlllgQ所以用第三种Ҏp然成了顺理成章的事。然而在使用q程中有时也会发玎ͼq告qo不很完美Q但原理基本如此?
Q出处:http://www.vipcn.comQ?/p>