ASP.NET2.0中ClientScriptManager的用法

在ASP.NET中管理脚本,正是System.Web.UI.ClientScriptManager类的特长。ClientScriptManager类通过Page.ClientScript暴露。在控件内部,可以通过this.Page.ClientScript得到ClientScriptManager实例。

ClientScriptManager类提供了大量生成客户端代码的方法:

—  RegisterArrayDeclaration——添加一个JavaScript数组到页面中。

—  RegisterClientScriptBlock——在页面的起始<form>标签后添加JavaScript脚本。

—  RegisterStartupScript——在页面的结束<form>标签前添加JavaScript脚本。

—  RegisterClientScriptInclude——在页面的起始服务端<form>标签后添加外部JavaScript文件引用。

—  RegisterClientScriptResource——添加已编译到程序集中的JavaScript资源文件的链接到页面中。

—  RegisterExpandoAttribute——生成为页面中的元素附加扩展属性的脚本(由于Javascript的动态特性,所以可以为对象随意附加属性)。

—  RegisterHiddenField——在页面的起始服务端<form>标签后添加一个隐藏表单域。

—  RegisterOnSubmitStatement——用于添加在页面回传服务端前执行的JavaScript脚本。

—  GetPostBackClientHyperLink——生成类似于javascript:__doPostBack(‘element’,’args’)的脚本,可用于完成回传服务端的链接。

—  GetPostBackEventReference——以GetPostBackClientHyperLink功能类似,只是没有javascript:前缀。

—  GetWebResourceUrl——生成编译到程序集中的资源文件的链接。

—  RegisterForEventValidation——生成事件验证代码,事件验证指事件回传后验证参数是否来源于最初呈现这些事件的服务端控件。需要在Config文件或页面指定中指定启用EnableEventValidation。

此外,ClientScriptManager类还有一大堆IsXXXResistered()方法,用来判断某个客户端代码是不是已经注册到了页面中。

ClientScriptManager的编程接口相当丰富,我们将在后面使用它们。

注:Page类也提供了有一些注册脚本的方法,比如:Page.RegisterClientScriptBlock(),这些方法的功能与ClientScriptManager中的同名方法类似,并且在ASP.NET 2.0中已不推荐使用。

要往页面中呈现脚本,我们可以选择ClientScriptManager.RegisterClientScriptBlock()方法或ClientScriptManager.RegisterStartupScript()方法。这两个方法的参数和功能都差不多,不同之处在于它们将代码呈现在页面的不同的地方,前一个方法将客户端代码呈现在页面表单的最前面,也就是这些代码位于所有页面元素之前,这使得脚本最先被浏览器解析;后一个方法将客户端代码呈现在页面表单的最末端,页面解析这些脚本时,页面上的各种元素已经完成解析,这就使得这些脚本可以马上操作页面上的元素。

所以我们常用前一个方法呈现一些不会马上执行的代码,比如声明某个按钮的Click事件处理程序,而用后一个方法呈现页面加载完成后马上执行的代码,比如定义某个变量的初始值,对页面元素进行某种操作。

比如前面的HelloWorld例子,可以改写成这样:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.ClientScript.IsClientScriptBlockRegistered( "HelloWorldDeclaration"))
{
        Page.ClientScript.RegisterClientScriptBlock(typeof(string),"HelloWorldDeclaration", "function sayHello(){alert('Hello world!');}", true);

    }

if (!Page.ClientScript.IsStartupScriptRegistered("HelloWorldExecution"))
{
        Page.ClientScript.RegisterStartupScript(typeof(string),"HelloWorldExecution", "sayHello();", true);

    }
}

在这段代码中,我们分别使用RegisterClientScriptBlock()方法声明sayHello()方法,用RegisterStartupScript()方法呈现执行sayHello()方法的代码,这两个方法的最后一个参数设为true,使得这两个方法将自动生成<script>标签对。在使用这两个方法的过程中,还使用配套的IsXXXRegistered()方法对代码是否已经注册过进行判断。在这个页面中使用这些判断并没有太大的意义,但在控件中却很有必要性,因为你不知道用户会放多少个同样的控件到页面中,如果每个控件实例都呈现一遍相同的脚本,则会在页面中产生大量冗余代码。

以上代码执行的效果和之前的代码在IE中执行的效果一样,它呈现的代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Hello world</title>
</head>
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">

<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGTx6EI+PAxNT6AKrLWgBOrSl69iWw==" />
</div>

<script type="text/javascript">
<!--
function sayHello(){alert('Hello world!');}
// -->
</script>

<div></div>

<script type="text/javascript">
<!--
sayHello();
// -->
</script>

</form>
</body>
</html>

结果完全符合xHTML标准的要求,大大减少了在客户端出现错误的机率。

posted @ 2009-08-03 11:32  汉卿  Views(256)  Comments(0Edit  收藏  举报