??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品白浆高清久久久久久,久久精品国产精品亚洲下载,国产精品久久久久AV福利动漫http://www.shnenglu.com/Jeff-Chen/category/1413.htmlzh-cnSat, 24 May 2008 00:36:46 GMTSat, 24 May 2008 00:36:46 GMT60IIS、ASP.NET和SQLServer的安全性问?http://www.shnenglu.com/Jeff-Chen/archive/2006/05/12/6993.htmlJeff-ChenJeff-ChenFri, 12 May 2006 03:28:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/12/6993.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6993.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/12/6993.html#Feedback0http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6993.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6993.html SQL Server、Internet 信息服务器和 ASP.NET 引擎都提供了坚实可靠的安全模型,它们可以很好地在一起协同工作。ؓ了保证用h据和应用E序的安全,Microsoft qؓ每项服务的默认设|设|了相当低的倹{大多数开发h员面临的挑战是如何?SQL Server、IIS ?ASP.NET 在应用程序和数据之间讄适当的信ȝ别,而不会留下可被别易攻入的安全漏洞。由于涉及三cL务(SQL Server、IIS ?ASP.NETQ,所以需要采取三个关键的步骤来确保解x案的安全。本部分讨论一Uؓ Web 应用E序讄_权限和信ȝ别的更常用(且可靠)的方法?

定义 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下拉框中选择 Q?lt;新徏>Q?br />·昄 SQL Server Login Properties - New LoginQSQL Server d属?- 新徏dQ对话框Ӟ选择 GeneralQ常规)选项卡,q在 NameQ名Uͼ输入框中输入 DotNetKB。确保选中 Windows AuthenticationQWindows 验证Q单选按钮,q从 DomainQ域Q下拉框中选择自定义用户帐h在的计算机的名称。然后从 DatabaseQ数据库Q下拉框中选择 DotNetKB?br />·现在Q选择 DatabasesQ数据库Q选项卡,在对话框剙的列表中扑ֈ DotNetKB 数据库ƈ选中它。然后,保选中对话框底部列表中?publicQ公共)角色。最后,单击对话框底部的 OKQ确定)按钮Q保存您的更攏V?



?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:

<configuration>
  <system.web>
    ... 其他要素 ...
    <identity impersonate="true"/> <!-- 假设 IIS 用户标识 -->
    ... 其他要素 ...
  </system.web>
</configuration>


h意,您只需d 元素q将模拟Ҏ设|ؓ trueQ真Q。不必输入用户帐h密码Q因些信息将?IIS 提供。也是_即其他够读取您的配|文Ӟ他们也无法确定用哪些标识凭据来执行您的 Web 应用E序?

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" />




Jeff-Chen 2006-05-12 11:28 发表评论
]]>使用VBScript和JScript~写WEB应用E序Q对比分析)http://www.shnenglu.com/Jeff-Chen/archive/2006/05/11/6924.htmlJeff-ChenJeff-ChenThu, 11 May 2006 03:21:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/11/6924.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6924.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/11/6924.html#Feedback0http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6924.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6924.html
我心飞扬

写这文章的动机是看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!!


Jeff-Chen 2006-05-11 11:21 发表评论
]]>
如何把ASP~写成DLLhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6870.htmlJeff-ChenJeff-ChenWed, 10 May 2006 06:12:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6870.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6870.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6870.html#Feedback0http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6870.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6870.html服务器端lg

首先,服务器端的组件要有别于客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?
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

Z在HellowordcM使用ASP的方?你必d此类中写一个OnStartPage
子函?如下:

Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
End Sub
现在,无论什么时候用戯问一个带有本lg的ASP文g,IIS׃把ScriptingContext传送给我们的对象请我们使用.q个ScriptingContext包括了全部的ASPҎ和属?实现?q得我们有能力讉K所有ASP的对?看下面的代码:

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
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session

使用ASP的对?
我们的变量现在就能像标准的ASP对象来用了!比如,我们l常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功?代码如下:

用ASP中实?
Q?
MyTempVariable = Request.Form("userName")
Response.Write ("you entered "& MyTempVariable & "as your user name")
%>

在VB中实?

MyTempVariable = MyRequest.Form("userName")
MyResponse.Write ("you entered "& MyTempVariable & "as your user name")

通过使用MyResponse来代替Response,我们能够使用所有Response的方?当然,MyResponseq个名字可以随便来取,你甚臛_以就取Response.


Jeff-Chen 2006-05-10 14:12 发表评论
]]>
ASP.NET热点问题解答14个(开发中l常遇到Q?/title><link>http://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6862.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Wed, 10 May 2006 03:37:00 GMT</pubDate><guid>http://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6862.html</guid><wfw:comment>http://www.shnenglu.com/Jeff-Chen/comments/6862.html</wfw:comment><comments>http://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6862.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Jeff-Chen/services/trackbacks/6862.html</trackback:ping><description><![CDATA[ <p>1、ASP.NET能在那些pȝ中运行? <br /><br />   目前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的支持?<br /><br />   2、在一个ASPX文g中是否可以用一U以上的语言Q?<br /><br />   {案让你有点失望Q虽然微软的提供了公paq行环境QCLRQCommon Laguage RuntimeQ?实现了多U编E语a间的紧密集成Q可以允怽从一个VB对象中导出CQ所需的对象来Q但一个ASPX文g中只能用一U语aQ正如你不能在VB.NET中用C#的语法一栗?<br /><br />   3、ASPX文g的服务器端脚本支持那些语aQ?<br /><br />   目前QASPX文g只支持CQ、Visual Basic.NET、Jscript.NET和J#Q但是你使用code—behind(代码分离)的方法创Z个独立代码文Ӟ你就可以使用M.NET~译器支持的语言来实现功能了?<br /><br />   4、在Global.asax文g中能使用code—behindQ代码分)技术吗Q?<br /><br />   当然可以了,例如Q?<br />   Global.asaxQ?<br /><br />   和用code—behindQ代码分)技?<br />   Global.asaxQ?<br /><br /><code>   MyApp.vb: <br />   Imports System.Web <br />   Imports System.Web.SessionState <br />   Public Class MyApp <br />   Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) <br />   Application("online_session") = 0 <br />   End Sub <br />   Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) <br />   Application.Lock() <br />   Application("online_session") = CInt(Application("online_session")) + 1 <br />   Application.UnLock() <br />   End Sub <br />   Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) <br />   Application.Lock() <br />   Application("online_session") = CInt(Application("online_session")) - 1 <br />   Application.UnLock() <br />   End Sub <br />   End Class <br /></code>   5、我能否看到ASPX文g在ASP.NET中生成的代码吗? <br /><br />   可以看到的,当你的ASPX文g中包含命令或Web.config中声明了Ӟ你就可以在系l目录下的Microsoft.NET\Framework\v1.0.nnnn\Temporary ASP.NET Files中找到ASPX文g在ASP.NET下生成的文g?<br /><br />   6、在ASPX文g中如何注释呢Q?<br /><br />   同ASP文g中的Ҏ一栗?<br /><br /><br />   7、ASPX文g中是否可以存在一个以上服务器?Form 标记Q?<br /><br />   不可?<br /><br />   8、我可以在WebH体中用自定义数据cd?<br /><br />   可以Q你可以把包含自定义数据cd的DLL文g攑֜E序根目录下的BIN目录中,ASP.NET会在数据cd引用Ӟ装蝲DLL文g的?<br /><br />   9、我能在Global.asax文g中触发那些事Ӟ <br />   Application对象创徏和结束时所触发的事件有 <br />   ?Application_Start <br />   ?Application_End <br />   Session对象创徏和结束时所触发的事件有 <br />   ?Session_Start <br />   ?Session_End <br />   对程序有h发生时触发的事g?(按发生顺序排? <br /><code>   ?Application_BeginRequest <br />   ?Application_AuthenticateRequest <br />   ?Application_AuthorizeRequest <br />   ?Application_ResolveRequestCache <br />   ?Application_AcquireRequestState <br />   ?Application_PreRequestHandlerExecute <br />   ?Application_PostRequestHandlerExecute <br />   ?Application_ReleaseRequestState <br />   ?Application_UpdateRequestCache <br />   ?Application_EndRequest <br /></code>   当有E序有错误发生时触发的事件有 <br />   ?Application_Error <br />   ?Application_Disposed <br />   10、Web控g是否支持样式表(CSSQ呢Q?<br /><br /><code>   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: <br /><br /></code>   支持Q所有的Web控g都从基类System.Web.UI.WebControls.WebControl中承了一个叫做CssClass的属性?<br />   例如Q?<br /><br /><code>   Qhtml> <br />Qhead> <br />Qstyle> <br />.Input { font: 10pt verdana; color: red; } <br />Q?style> <br />Q?head> <br />Qbody> <br />Qform runat="server"> <br />Qasp:TextBox CssClass="Input" RunAt="server" /> <br />Q?form> <br />Q?body> <br />Q?html> <br /><br /></code>    11、在ASPX文g中默认导入那些名U空_ <br /><br />   ASPX默认导入的名U空间可以直接引用了Q用其它的名称I间q自行导入了?<br /><br />   默认名称I间 <br /><code>   ?System <br />   ?System.Collections <br />   ?System.Collections.Specialized <br />   ?System.Configuration <br />   ?System.Text <br />   ?System.Text.RegularExpressions <br />   ?System.Web <br />   ?System.Web.Caching <br />   ?System.Web.Security <br />   ?System.Web.SessionState <br />   ?System.Web.UI <br />   ?System.Web.UI.HtmlControls <br />   ?System.Web.UI.WebControls <br /></code>   12、我是否可以自己创徏服务器控件呢Q?<br /><br />   可以Q创作您自己?ASP.NET 服务器控件很Ҏ。创建简单的自定义控件时Q您所要做的只是定义从 System.Web.UI.Control z的类q写它?Render Ҏ。Render Ҏ采用 System.Web.UI.HtmlTextWriter cd的参数。控件要发送到客户端的 HTML 作ؓ字符串参C递到 HtmlTextWriter ?Write Ҏ?<br />   例如Q?<br />服务器控件代码(单显C字W串Q:Simple.vbQ?<br /><code>Imports System <br />Imports System.Web <br />Imports System.Web.UI <br /><br />Namespace SimpleControlSamples <br /><br />Public Class SimpleVB : Inherits Control <br /><br />Protected Overrides Sub Render(Output As HtmlTextWriter) <br />Output.Write("QH2>Ƣ迎使用控g开发!Q?H2>") <br />End Sub <br />End Class <br />End Namespace <br />引用文gSimple.aspxQ?<br />Q?@ Register TagPrefix="SimpleControlSamples" Namespace="SimpleControlSamples" Assembly="SimpleControlSamplesVB" %> <br /><br />Qhtml> <br />Qbody> <br />Qform method="POST" action="Simple.aspx" runat=server> <br />QSimpleControlSamples:SimpleVB id="MyControl" runat=server/> <br />Q?form> <br />Q?body> <br />Q?html> <br /><br /></code>   13、如何在ASP.NETE序中发送邮件呢Q?<br /><br />   在ASP.NETE序中发送邮件不再象ASP中那样需要组件的支持了,?NET的框架基cȝSystem.Web.Mail名称I间内包含的MailMessage和SmtpMailcd以实现这个功能?<br />   例如Q?<br /><code>   Dim message As new Mail.MailMessage <br />   message.From = "web3@163.com" <br />   message.To = "web3@163.com" <br />   message.Subject = "试" <br />   message.Body = "内容" <br />   Mail.SmtpMail.SmtpServer = "localhost" <br />   Mail.SmtpMail.Send(message) <br /><br /></code>   14、我如何通过ADO.NETd数据库中的图片ƈ昄它呢Q?<br /><br />   下面举一个从Microsoft SQL Server的PUB数据库读取图片ƈ昄它的例子Q?<br />   下面举一个从Microsoft SQL Server的PUB数据库读取图片ƈ昄它的例子Q?<br /><code>Q?@ Import Namespace="System.Data.SqlClient" %> <br />Q?@ Import Namespace="System.Drawing" %> <br />Q?@ Import Namespace="System.Drawing.Imaging" %> <br />Q?@ Import Namespace="System.IO" %> <br />Qscript language="VB" runat="server"> <br />Sub Page_load(Sender as Object, E as EventArgs) <br />dim stream as new MemoryStream <br />dim connection as SqlConnection <br />connection=new SqlConnection("server=localhost;database=pubs;uid=sa;pwd=") <br />try <br />connection.Open() <br />dim command as SqlCommand <br />command = new SqlCommand ("select logo from pub_info where pub_id='0736'", connection) <br />dim image as byte() <br />image = command.ExecuteScalar () <br />stream.Write (image, 0, image.Length) <br />dim imgbitmap as bitmap <br />imgbitmap = new Bitmap (stream) <br />Response.ContentType = "image/gif" <br />imgbitmap.Save (Response.OutputStream, ImageFormat.Gif) <br />Finally <br />connection.Close() <br />stream.Clse() <br />End Try <br />End Sub <br />Q?script> <br /></code></p> <img src ="http://www.shnenglu.com/Jeff-Chen/aggbug/6862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-10 11:37 <a href="http://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从ASPq渡到ASP.net遗留的二十大U习(我就犯了其中的一半错?http://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6861.htmlJeff-ChenJeff-ChenWed, 10 May 2006 03:26:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6861.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6861.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6861.html#Feedback0http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6861.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6861.html在技术更新的q程? 仍然有一些hL着已经q了气的东西不放. 也有一些h虽然q入到新的世? 但仍摆脱不了陈旧的习? 我没有用”陋习”这个词, 因ؓ我对q个词也非常反感.

新技术应该有新技术的做法, 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



Jeff-Chen 2006-05-10 11:26 发表评论
]]>
ASP实现囄上传http://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6859.htmlJeff-ChenJeff-ChenWed, 10 May 2006 02:54:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6859.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6859.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/10/6859.html#Feedback1http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6859.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6859.html用ASP~写|站应用E序旉长了Q难免会遇到各式各样的问题,其中关于如何上传文g到服
务器恐怕是遇见最多的问题了,其是上传图片,比如你想要在自己的社区里面实现类似网?
虚拟C֌ 提供的“每日一星”的功能Q就要提供给|友上传照片的功能。上传图片文件到服务
器可以用各U免费的文g上传lgQ用v来功能虽然很强大Q但是由于很多情况下Q我?
只能使用免费的支持AQI的空间或者租用别人的虚拟I间Q对于第一U情况,我们Ҏ没
有可能来使用文g上传lgQ至于第二种情况Q我们也要付Z的“银子”才可以。除非你
拥有自己的虚拟主机,你就可以随便的在服务器上面安装自己所需要的lgQ这U情况对于大
多数人来说是可望而不可及的。那我们没有办法了吗?呵呵Q答案是肯定的(当然是肯定的
了,要不然我也没法写文章啊Q。下面就让我们一h使用UAQI代码来实现图片的
上传以及保存到数据库的功能(Z也实现显C数据库中的囄到网上的功能)?


   首先我们先来熟悉一下将要用的对象Ҏ。我们用来获取上一个页面传递过来的数据一
般是使用Request对象。同LQ我们也可以使用Request对象来获取上传上来的文g数据Q
用的Ҏ是Request.BinaryRead()。而我们要从数据库中读出来囄的数据显C到|页上面?
用到的方法是Q?
Request.BinaryWrite()。在我们得到了图片的数据Q要保存到数据库中的时候,不可以直?
使用Insert语句Ҏ据库q行操作Q而是要用ADO的AppendChunkҎQ同LQ读出数据库
中的囄数据Q要使用GetChunkҎ。各个方法的具体语法如下Q?
*Request.BinaryRead语法Q?
variant=Request.BinaryRead(count)
参数
variant
q回g存着从客Ld到数据?
count
指明要从客户端读取的数据量大,q个值小于或者等于用方法Request.TotalBytes得到?
数据量?
*Request.BinaryWrite语法Q?
Request.BinaryWritedata
参数
data
要写入到客户端浏览器中的数据包?
*Request.TotalBytes语法Q?
variant=Request.TotalBytes
参数
variant
q回从客Ld到数据量的字节数?
*AppendChunk语法
数据追加到大型文本、二q制数据Field或Parameter对象?
object.AppendChunkData
参数
objectField或Parameter对象
Data变体型,包含q加到对象中的数据?
说明
使用Field或Parameter对象的AppendChunkҎ可将长二q制或字W数
   据填写到对象中。在pȝ内存有限的情况下Q可以用AppendChunkҎ寚w整型D?
部分而非全部的操作?
*GetChunk语法
q回大型文本或二q制数据Field对象的全部或部分内容?
variable=field.GetChunk(Size)
q回?
q回变体型?
参数
Size长整型表辑ּQ等于所要检索的字节或字W数?
说明
   使用Field对象的GetChunkҎ索其部分或全部长二进制或字符数据。在pȝ内存有限
的情况下Q可使用GetChunkҎ处理部分而非全部的长整型倹{?
GetChunk调用q回的数据将赋给“变量”。如果Size大于剩余的数据,?
GetChunk仅返回剩余的数据而无需用空白填充“变量”。如果字DؓI,?
GetChunkҎq回Null?
   每个后箋的GetChunk调用检索从前一ơGetChunk调用停止处开始的数据。但是,如果?
一个字D|索数据然后在当前记录中设|或d另一个字D늚|ADO认为已从第一个字D?
中检索出数据。如果在W一个字D上再次调用GetChunkҎQADO把调用解释为新的GetChu
nk操作q从记录的v始处开始读取。如果其他Recordset对象不是首个Recordset对象的副本,
则访问其中的字段不会破坏GetChunk操作?
如果Field对象的Attributes属性中的adFldLong位设|ؓTrueQ则可以对该字段使用GetChun
kҎ?
如果在Field对象上用GetchunkҎ时没有当前记录,生错?021Q无当前记录Q?
   接下来,我们p来设计我们的数据库了Q作为测试我们的数据库结构如下(Access200
0Q:


字段名称    cd    描述
   id   自动~号   主键?
img OLE对象   用来保存囄数据 


对于在MSSQLServer7中,对应的结构如下:
字段名称    cd    描述
   id    int(Identity)  主键?
img   image    用来保存囄数据
现在开始正式编写我们的UAQI代码上传部分了,首先Q我们有一个提供给用户的上传界?
Q可以让用户选择要上传的囄。代码如?
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我们要在process.asp中对从浏览器中获取的数据q行必要的处理,?
为我们在process.asp中获取到的数据不仅仅包含了我们想要的上传上来的图片的数据Q也?
含了其他的无用的信息Q我们需要剔除冗余数据,q将处理q的囄数据保存到数据库中,q?
里我们以access2000Z。具体代码如下(process.aspQ:
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剩下的工作是?
数据库中的囄数据昄到网上面了。一般在QTQL中,昄囄都是使用QIMG>标签
Q也是QIMGSRC="囄路径">Q但是我们的囄是保存到了数据库中,“图片\径”是什?
呢?呵呵Q其实这个SRC属性除了指定\径外Q也可以q样使用哦:
QIMGSRC="showimg.asp?id=xxx">
所以,我们所要做的就是在showimg.asp中从数据库中d来符合条件的
数据Qƈq回到SRC属性中可以了Q具体代码如下(showimg.aspQ:
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我的process.asp中作的处理没有考虑到第一?upload.htm)中还有其
他数据,比如QINPUT type=tesxt name=userid>{等Q如果有q些目Q你的process.asp?
要注意处理掉不必要的数据?



Jeff-Chen 2006-05-10 10:54 发表评论
]]>
强烈推荐QASP.NETE序中常用的三十三种代码(?http://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6650.htmlJeff-ChenJeff-ChenFri, 05 May 2006 10:23:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6650.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6650.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6650.html#Feedback0http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6650.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6650.html18.日期格式?br />
  【aspx面内:Q?# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date")%Q?br />
  昄为: 2004-8-11 19:44:28

  我只惌Q?004-8-11 ?br />
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");
}


Jeff-Chen 2006-05-05 18:23 发表评论
]]>
强烈推荐QASP.NETE序中常用的三十三种代码(?http://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6649.htmlJeff-ChenJeff-ChenFri, 05 May 2006 10:22:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6649.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6649.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6649.html#Feedback0http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6649.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6649.html1. 打开新的H口q传送参敎ͼ

  传送参敎ͼ

response.write("QscriptQwindow.open(?.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"?Q?scriptQ?)
  接收参数Q?br />
string a = Request.QueryString("id");
string b = Request.QueryString("id1");

  2.为按钮添加对话框

Button1.Attributes.Add("onclick","return confirm(’确??");
button.attributes.add("onclick","if(confirm(’are you sure...??){return true;}else{return false;}")

  3.删除表格选定记录

int intEmpID = (int)MyDataGrid.DataKeys[e.Item.ItemIndex];
string deleteCmd = "DELETE from Employee where emp_id = " + intEmpID.ToString()

  4.删除表格记录警告

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;
 }

}

  5.点击表格行链接另一?br />
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 + "?;");
}

  双击表格q接到另一?br />
  在itemDataBind事g?br />
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 + "?);
}

  双击表格打开C?br />
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");


Jeff-Chen 2006-05-05 18:22 发表评论
]]>ASP.NET中弹出窗口技?/title><link>http://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6648.html</link><dc:creator>Jeff-Chen</dc:creator><author>Jeff-Chen</author><pubDate>Fri, 05 May 2006 10:20:00 GMT</pubDate><guid>http://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6648.html</guid><wfw:comment>http://www.shnenglu.com/Jeff-Chen/comments/6648.html</wfw:comment><comments>http://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6648.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Jeff-Chen/services/trackbacks/6648.html</trackback:ping><description><![CDATA[摘要Q本文讨论如何以ASP.NET中的CodeBehind方式实现各种弹出H口Q实C弹出H口的交互。ƈ探讨常用非标准IE览器对弹出的窗口的各种qo行ؓ及用弹出窗口相应对{,以期l出使用弹出H口的一个通用较优Ҏ? <p>  关键词:ASP.NET、CodeBehind、过滤、COM接口、JavaScript、绑?/p><p>  作ؓ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><p>  Z提高|站的访问的q发度和吞吐量,与其它服务器脚本一PASP.NET同样使用了客L脚本来减L务器的压力。ASP.NET到现?1.1?为止q不直接支持弹出H口Q必通过JavaScriptQ或VBScriptQ来使用客户端弹出窗口?/p><p>  一?警告H口与在CodeBehind中用客L脚本的方?/p><p>  要在览器中弹出一个最单的警告H口Q可以用JavaScript语句Q?/p><p>window.alert( [sMessage]) </p><p>  其中QsMessage是提CZ息。可惜,q样的弹出窗口是只有一个“确定”按钮,只能起到提示作用。如果我们要在删除记录时候弹Z个询问的弹出H口Q此时你需要用:</p><p>bConfirmed = window.confirm( [sMessage])</p><p>  其中QbConfirmed是返回|sMessage是提CZ息。这个弹出窗口有两种选择Q“确定”或“放弃”,光择的返回值放在bConfirmed中,可供代码作出判断?/p><p>  Z提高代码的可重用性与可读性,应当使JavaScript与Codehind怺溶合。通常有两U方式可以达到这L效果?/p><p>  Q?Q?使用Response.WriteҎQ?/p><p>  使用Response.WriteҎ早在ASP时代已l被支持了。它可以把代码写到客LQ是一U相当方便且直观的方法。以下代码演CZ如何使用Response.WriteҎ来显CZ个警告信息?/p><p>Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAlert.Click<br /> ’演CResponse.WriteҎ和alertH口?br /> Response.Write(" ")<br />End Sub </p><p>  Q?Q?使用RegisterXXXҎ</p><p>  如果你观察Response.Write的生成HTML代码Q你会发现Response.WriteҎ生成的代码是写到了HTML代码的最开始,x{之前。此Ӟ所有的 HTML对象都还没有生成Q如果要想用HTML内的对象Qƈ与之交互Q就会出现“找不到对象”的错误。因此,W者推荐一个更加符合CodeBehind方式的方?---使用RegisterXXXҎ。RegisterXXX包括QRegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数?/p><p>  RegisterStartupScript 的原型是Q?/p><p>Overridable Public Sub RegisterStartupScript( _<br /> ByVal key As String, _<br /> ByVal script As String _<br />) </p><p>  其中Qkey表示q个脚本的唯一标识Qscript是代表脚本的字符丌Ӏ?/p><p>  RegisterClientScriptBlock的原型与RegisterStartupScript相同Q两个函C同在于将其包含的脚本代码写入到HTML文g的不同位|。RegisterClientScriptBlock?Page 对象?元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象?元素的结束标C前发脚本。如果你的脚本有与页面对?doucument对象)q行交互的语句(q在我们后面的例子中看到Q,则推荐用RegisterStartupScriptQ反之如果要惛_L脚本可能早的执行,则可以用RegisterClientScriptBlock或Response.Write?/p><p>  Z防止在页面中反复加入脚本Q在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作ؓ注册的KeyQ然后在E序中可以用IsClientScriptBlockRegistered作判断?/p><p>  以下例子用RegisterClientScriptBlock来演Cconfirm的用方法?/p><p>Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConfirm.Click</p><p> ’演CRegisterClientScriptBlockҎ和confirmH口</p><p> If (Not IsClientScriptBlockRegistered("clientScript")) Then<br /> ‘判断是否已l加入了该脚本,没有则加入?br />  Dim strScript As String <br />  strScript = " "<br /> ‘注册脚?<br />  RegisterClientScriptBlock("clientScript", strScript)<br /> ‘如果选择”否”,则l向下执行?br /> End If</p><p>End Sub </p><p>  二?弹出指定面</p><p>  光有提示H口q远q不能满x们的要求Q在E序中,我们常常需要弹出指定页面。此时可以用JavaScript的window.openҎ。配合前面的RegisterClientSciptBlockҎQ我们就可以实现指定面的弹出?/p><p>  以下代码展示了如何弹出指定页?</p><p>Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click</p><p> ’用window.open与registerStartupScript单演C?/p><p> If (Not IsClientScriptBlockRegistered("OpenScript")) Then<br />  ’判断是否已l加入了该脚本,没有则加入?br />  Dim strScript As String = " "<br />  RegisterStartupScript("OpenScript", strScript)<br /> End If<br />End Sub </p><p>  E序使用Window.openҎ来弹出新的页面,它只一个参敎ͼ新的弹出H口的URL地址。事实在window.openҎ有多个参敎ͼ但这是javascipt的简单内容,我们不会在q儿详细分说。如果你有相关的问题Q请查询MSDN?/p><p>  q段E序在IE中直接用一切正常。但如果你正在用类如GoSurf、MyIE2、NetCapter之类的浏览器Q那么,很不q! 你将看不到弹出窗口。这是我们要讨论的弹出窗口过滤问题?/p><p>  三?非标准IE览器对弹出H口的过滤行?/p><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方式进行广告过滤:</p><p>  Q?Q、基于窗口标题的杀方式</p><p>  q种杀方式的原理是定时查所有的IEH口标题,然后于已l有的列表(q序维护的一个数l列表)来比?如果有相同的,我们关闭这个窗口。显Ӟq种方式有着诸多~陷Q它杀了所有的弹出的窗口,得太死Q在E序真正使用的很。不q,依据它进行的变Ş方式倒用得相当的普遍。那是Q基于窗口标题名U的qo技术,它根据弹出窗口的标题是否含有关于q告的关键字q行杀Q这为提高过滤效果作Z很好的探索?/p><p>  Q?Q、基于窗口类和位|的杀方式</p><p>  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><p>  Q?Q、基于IE COMlg的封杀方式</p><p>  以上两种方式都是把IEH口当作一个普通的WindowsH口对待Q进行判断的。事实上QIE是一个典型的ZCOMlg的浏览器Q所有的ZIE内核的浏览器都是包装shdocvw.dll文gQ然后书写相应的BHO代码。只有这h能做到真正的控制IE览器,而不是方法一、二q样的隔靴搔痒?/p><p>  q有一U基于IE内核的弹出窗口封杀Ҏ。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事gQ执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)Ҏ。重载此ҎQ判断打开新窗口事件是否发生在览面已经下蝲完毕之后。如果是Q说明是正常的弹出窗口,反之加以拦截?/p><p>  ׃Gosurfq样的浏览器本n重载了Shocvm.dlllgQ所以用第三种Ҏp然成了顺理成章的事。然而在使用q程中有时也会发玎ͼq告qo不很完美Q但原理基本如此?</p><p align="right">Q出处:<a title="|络学院" target="_blank">http://www.vipcn.com</a>Q?/p><img src ="http://www.shnenglu.com/Jeff-Chen/aggbug/6648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Jeff-Chen/" target="_blank">Jeff-Chen</a> 2006-05-05 18:20 <a href="http://www.shnenglu.com/Jeff-Chen/archive/2006/05/05/6648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是DNN(DotNetNuke)http://www.shnenglu.com/Jeff-Chen/archive/2006/04/28/6410.htmlJeff-ChenJeff-ChenFri, 28 Apr 2006 01:37:00 GMThttp://www.shnenglu.com/Jeff-Chen/archive/2006/04/28/6410.htmlhttp://www.shnenglu.com/Jeff-Chen/comments/6410.htmlhttp://www.shnenglu.com/Jeff-Chen/archive/2006/04/28/6410.html#Feedback1http://www.shnenglu.com/Jeff-Chen/comments/commentRss/6410.htmlhttp://www.shnenglu.com/Jeff-Chen/services/trackbacks/6410.html什么是Dotnetnuke?

Dotnetnuke是一个免贏V开源、可扩展、几q完的内容理pȝ。可q泛应用于商务网站、企业内|(IntranetQ和外网|站、在U内容发布网站?/font>

 
Dotnetnuke是徏立在微YASP.NETq_之上的一套Web应用框架?/div>
 
Dotnetnuke是微软第一ơ向开源说”Yes”的里程?/div>
 
Dotnetnuke 是门L站的未来?
 

Dotnetnuke的特?/h2>
        通用?         ――――几乎可以用来构MWeb应用Q商务网站,企业内网Q外|,在线内容发布?/div>
       用户友好性  ?―――—其设计考虑非常周全Q借助站点向导Q无处不在的帮助图标{等Q用戯够很Ҏ的控刉目的各个斚w?/div>
         多网站支持  ?――――套E序部v可以支持多个网站。每个网站都有各自的理员和独特面布局?/div>
         技术支持     ?――――Dotnetnuke有一个核心开发团队和国际化的支持C֛。DNN的用L、论坛、资源网站以及专注与DNN技术的很多公司Q全方位的提供支持和帮助?/div>
        安装单     ?――――从www.Dotnetnuke.com (英文? ?a >www.DnnChina.net (中文?下蝲软g以后Q按照安装指导的步骤Q只需要几分钟可以完成?/div>
         本地化         ?――――到目前为止已经?7个语a包,能很L的把您的|站转换成几乎Q何语a。语a包也是可扩展的,您可以很Ҏ的创q特色语言包?/div>
         开放源代码    ――――DNN是免贏V开放源代码目Q采用类BSD风格的授权方式。容怓Q何h按自qxQ商业和非商业的使用DNN.。BSD开源协议是一个给于用者很大自q协议。基本上使用者可?为所Ʋؓ",可以自由的用,修改源代码,也可以将修改后的代码作ؓ开源或者专有Y件再发布。你只需要源代码中带有原来代码中的BSD协议?/div>
         高扩展性     ?――――DNN内徏的功能已l够构Z个非常复杂的内容理pȝ。DNN提供了全新的在线式功能块扩展Q无论是W三Ҏ块还您自己开发的模块Q都能随时很Ҏ的加入到正在q行的网站中?/div>被广泛认同  ?――――Dotnetnuke已经是一个商标,得到了开源社区的q泛认同和尊重。Dotnetnuke.comQ英文)已经有超q?70,000的注册用PDnnChina.netQ中文)已经有超q?,600的注册用戗?/div>

Jeff-Chen 2006-04-28 09:37 发表评论
]]> ݹƷþþþþ| ĻӰӾþþѹۿ| ҹƷþþþþëƬ| þۺ㽶AV| ޾ƷŮþþ| 7ŷպۺľþþþ| þۺĻ| þþþþþ97| Ʒþþø| þݺҹҹav˳ | ɫ͵͵88888ŷƷþþ| ھƷ˾þþþAVӰԺ| þþþAVȥ| պƷþþþþ| þþþþݴۺϾƷ| ޹ŷۺϾþ| þþƷһ| AVպƷþþþþ | 99ξþþŷƷվ | þҹӰ| ƷþþþþӰԺ| ŷպƷþþѹۿ| 99þùۺϾƷˮ| þþƷAV| þþƷѹۿ97| þùƷ99þþþþ| ޾Ʒþһ| þݺҹҹ2014| ҹƷþþþþ| ŷþþþþþѡ9999| 777þþƷһ | 91鶹Ʒ91þþþþ| Ʒþþþù| þԭavapp| Ů޾Ʒþþۺ| AŮAVۺϾþþ| þ99Ʒþþþþˮ | ާѡþþþƷ9966| Ʒһþ| ޳˾þ| þŷ޹ۺ|