9.1.5 支持客户端脚本
ASP.NET提供了其他几个工具来支持客户端处理。下面就介绍这些工具。
1. 添加数组
服务器端代码可以访问服务器上的数据库,但在浏览器上执行的代码不能。这个问题的通常解决方法是在服务器端代码中提取数据库中的数据,把它们嵌入到客户端代码的一个静态数组中。RegisterArrayDeclaration方法不仅可以把需要的数组添加到页面上,还可以标记已添加的数组。这样,共享数据的控件(例如一组有效的顾客码)可以避免多次添加数据。
RegisterArrayDeclaration接受两个参数。
● 在客户端代码中包含数组的变量名
● 用于初始化数组的字符串
在下面的Visual Basic 2005示例中,创建了一个数组CustStatus,它包含四项:Rejected、Standard、Gold和Platinum。
Dim csm As System.Web.UI.ClientScriptManager
csm = Me.Page.ClientScript
csm.RegisterArrayDeclaration("CustStatus", _
"'Rejected', 'Standard', 'Gold', 'Platinum'")
C#的对应代码如下所示。
System.Web.UI.ClientScriptManager csm;
csm = this.Page.ClientScript;
csm.RegisterArrayDeclaration("CustStatus",
"'Rejected', 'Standard', 'Gold', 'Platinum'");
得到的JavaScript代码如下所示。
<script type="text/javascript">
<!--
var CustStatus = new Array("Rejected", "Standard", "Gold", "Platinum");
// -->
</script>
2. 客户端包含的内容
我们常常不在页面中包含所有的客户端代码,而不是把客户端代码放在一个单独的文件中,使用带src特性的<script>标记引用该文件。RegisterClientScriptInclude方法可以添加这类脚本标记,以引用脚本文件。
下面的Visual Basic 2005示例添加了对代码文件code.js的引用。
csm.RegisterClientScriptInclude("PHVBlock", "code.js")
C#的对应代码如下所示。
csm.RegisterClientScriptInclude("PHVBlock", "code.js");
得到的<script>元素如下所示。
<script src="code.js" type="text/javascript"></script>
提示:
使用包含文件,提供了一种实现策略“只为客户机提供它们支持的客户端代码”的方式。我们常常有一组只能在Netscape Navigator的最新版本上工作的客户端代码,它们不能不加任何修改地在早期版本上工作。为了处理这种区别,可以为每个要支持的浏览器编写一个代码版本,把这些版本放在不同的文件中。在运行时,用BrowserCapabilities对象检查浏览器的类型,用RegisterClientScriptInclude方法添加对脚本文件的引用,该脚本文件包含了可在该浏览器上工作的代码。
ASP.NET 2.0的规定是把客户端资源(例如脚本文件)放在Web服务器根目录下的一个虚拟目录aspnet_client下,这个虚拟目录在安装ASP.NET 2.0时创建。客户端资源应安装在:
● aspnet_client目录下
● 以应用程序命名的子文件夹下
● 根据应用程序的版本号命名的子文件夹下
例如,客户端代码文件code.js用于应用程序MyApplication的1.0.0.0版本,应放在文件夹/aspnet_client/MyApplication/1_0_0_0/下。
如果不把资源放在单独的文件中,还可以把代码文件直接放在应用程序的程序集中。要在应用程序的程序集中嵌入文件,只需把该文件添加到项目中,然后在文件的属性列表中,把该文件的Build Action设置为Embedded Resource。
实用程序WebResource.axd与.NET Framework一起发布,在用指定资源的查询字符串请求页面时,该实用程序可以检索出嵌入的资源。RegisterClientScriptResource方法可以生成一个script标记,其src特性引用WebResource实用程序,并检索出资源。下面的Visual Basic 2005示例检索出了资源code.js。
csm.RegisterClientScriptResource(Me.GetType, "code.js")
C#的对应代码如下所示。
csm.RegisterClientScriptResource(this.GetType(), "code.js");
得到的页面包含下述标记。
<script src="/WebPartsHostVB/WebResource.axd?d=
WylyhFDzry8iRJrQJB9A0hZkD_GD3HHX8pJs
r0kUntA1&t=632482109977226208" type="text/javascript"></script>
还可以使生成资源的URL,具体方法是:使用GetWebResourceURL方法,给它传送用于创建该资源的参数。这样,就可以把该URL嵌入到其他特性中,而不是RegisterClientscript Resource生成的script标记中。例如,下面的Visual Basic 2005代码把URL添加到控件的一个定制特性中,以显示控件的URL。
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
writer.AddAttribute("type", "text")
writer.AddAttribute("id", "txtName;")
writer.AddAttribute("MySrc", Me.Page.ClientScript. _
GetWebResourceURL(Me.GetType,"code.js"))
writer.RenderBeginTag("input")
writer.RenderEndTag()
End Sub
C#的对应代码如下所示。
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{ writer.AddAttribute("type", "text");
writer.AddAttribute("id", "txtName;");
writer.AddAttribute("MySrc", this.Page.ClientScript.
GetWebResourceURL(this.GetType, "code.js"));
writer.RenderBeginTag("input");
writer.RenderEndTag();
}
3. Expando特性
如上一个例子所述,可以自己定义要添加到标记中的特性,称为Expando特性。Expando特性实现为一组客户端代码。在浏览器发现客户机上有特性时,就会调用它。ClientScriptManager的RegisterExpandoAttribute方法支持把客户端代码添加到expando特性中。下面的Visual Basic 2005代码创建了一个用于<input>标记的特性EncryptionMethod,并将该特性的初始值设置为SHA1。
csm.RegisterExpandoAttribute("input", "EncryptionMethod", "SHA1")
C#的对应代码如下所示。
csm.RegisterExpandoAttribute("input", "EncryptionMethod", "SHA1");
得到的JavaScript代码如下所示。
<script type="text/javascript">
<!--
var input = document.all ? document.all["input"] :
document.getElementById("input");
input.EncryptionMethod = "SHA1";
// -->
</script>
提示:
这段代码定义了EncryptionMethod特性,但仍需要在页面上给标记添加EncryptionMethod特性。使用控件的Attributes集合,或第3章讨论的、用于处理自定义控件上特性的方法,可以给自定义控件(或其组成控件)添加特性。
4. 隐藏字段
客户端代码常常利用HTML隐藏字段(type特性设置为hidden的<input>标记)。RegisterHiddenField方法可以在页面上添加HTML隐藏字段,把它设置为某个初始值,同时确保只插入隐藏字段的一个副本。下面的Visual Basic 2005代码创建了一个隐藏字段BuildQueryString,给它设置了初始值“?”。
csm.RegisterHiddenField("BuildQueryString","?")
C#的对应代码如下所示。
csm.RegisterHiddenField("BuildQueryString","?");
得到的HTML如下所示。
<input type="hidden" name="BuildQueryString" id="BuildQueryString"
value="?" />






