科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET服务器控件发送脚本

ASP.NET服务器控件发送脚本

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将探讨服务器控件发送客户端脚本的两种方法,还将构建两个使用这些技术的服务器控件

作者:佚名 来源:微软 2007年11月8日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
使用 RegisterStartupScript() 和 RegisterClientScriptBlock() 添加客户端脚本块

  System.Web.UI.Page 类包含的两个方法可以将客户端脚本代码发送到由 ASP.NET Web 页面提供的 HTML 中:

RegisterStartupScript(key, script)
RegisterClientScriptBlock(key, script)

  这两个方法都接受两个字符串作为输入。第二个参数 script 是要插入到页面中的客户端脚本,包括 <script> 的起始标记和终止标记。第一个参数 key 是插入的客户端脚本的唯一标识符。

  这两个方法唯一的不同之处在于从“何处”发送脚本块。RegisterClientScriptBlock() 在 Web 窗体的开始处(紧接着 <form runat="server"> 标识之后)发送脚本块,而 RegisterStartupScript() 在 Web 窗体的结尾处(在 </form> 标识之前)发送脚本块。

  为什么会有两种不同的方法来发送客户端脚本?要更好地了解这一点,我们必须首先了解,客户端脚本可以分为两类:一类是在加载页面后立即运行的代码,一类是在发生某些客户端事件时才运行的代码。前者的常见示例是将焦点设置到文本框的客户端代码。例如,当您访问 Google 时,在页面加载后就会执行一小段客户端代码,以自动将焦点设置到搜索文本框。

  以下是后一类代码(为响应客户端事件而运行的代码)的示例。具体而言,在该示例中,单击按钮时将显示一个弹出式对话框:

<html>
<body>
<form>
<script language="JavaScript">
<!--
function displayPopup() {
alert("Hello, world.");
}
// -->
</script>

<input type="button" value="Click Me!" onclick="displayPopup()" />
</form>
</body>
</html>

  在这段代码中,<input> 标记中的 onclick="displayPopup()" 用于指明在单击按钮时,JavaScript 函数 displayPopup() 应该运行。

  RegisterStartupScript() 方法可用于添加要在加载页面后运行的脚本块。通过这种方法添加的脚本块位于 Web 窗体的结尾处,因为必须在脚本运行前定义脚本要修改的 HTML 元素。也就是说,如果您要使用客户端脚本将焦点设置到文本框,必须确保文本框的 HTML 标记位于设置该文本框的焦点的脚本之前。例如,下面的 HTML 将显示一个文本框,并将焦点设置到该文本框:

<input type="text" id="myTextBox" />

<script language="JavaScript">
<!--
document.getElementById("myTextBox").focus();
// -->
</script>

  相反,以下 HTML 不会将焦点设置到文本框,因为文本框是在脚本块“之后”定义的:

<script language="JavaScript">
<!--
document.getElementById("myTextBox").focus();
// -->
</script>

<input type="text" id="myTextBox" />

  因此,RegisterStartupScript() 方法将 <script> 块置于 Web 窗体的结尾处,以保证在执行客户端脚本之前已声明 Web 窗体中的所有 HTML 元素。

  RegisterClientScriptBlock() 方法用于为响应客户端事件而执行的脚本代码。通过此方法发送的脚本块位于 Web 页面的开始处,因为这种方法不要求将脚本块置于所有 HTML 元素之后。

  探讨IsStartupScriptRegistered() 和 IsClientScriptBlockRegistered()

  除RegisterStartupScript() 和 RegisterClientScriptBlock() 方法之外,Page 类还包含两个在发送客户端脚本时常用的辅助方法:

IsStartupScriptRegistered(key)
IsClientScriptBlockRegistered(key)

  如上所述,在使用 RegisterStartupScript() 或 RegisterClientScriptBlock() 插入客户端脚本块时,提供了一个唯一标识脚本块的关键字。这两个方法都接受一个输入(字符串 key),并返回一个布尔值,以指示带有指定关键字的脚本块是否已添加到页面中。具体地说,如果带有特定 key 的脚本块已经注册,这些方法将返回 True,否则将返回 False。

  要了解如何使用这两个方法,可以看一看 ASP.NET 验证 Web 控件,如 RequiredFieldValidator、RegularExpressionValidator 等等。这些控件都会用到一个常用的验证 JavaScript 文件 (WebValidation.js),该文件位于 ASP.NET Web 应用程序的 aspnet_client/system_web/版本号 目录中。因此,所有这些控件都会发送相同的脚本块,这个脚本块将调用在 WebValidation.js 文件中定义的相应的 JavaScript 函数,以启动客户端的验证过程。要完成这个过程,这些控件会使用 Page 类的 RegisterClientScriptBlock() 方法,并使用关键字 ValidatorIncludeScript。

  接下来要考虑的是,如果一个 ASP.NET Web 页面中包含多个验证 Web 控件,会出现什么情况呢?所有这些 Web 控件都要使用相同的关键字发送相同的脚本块。如果使用这个关键字调用两次 RegisterClientScriptBlock() 或 RegisterStartupScript() 方法,则第二次调用会被认为是复制脚本块而被忽略。因此,即使一个 Web 页面上有多个验证控件,也只是发送一个公共脚本块的实例。但是,请注意,除第一个控件之外的其他所有验证 Web 控件都会构建要发送的公共客户端脚本,而这只是在浪费时间。

  这时就应该使用 IsClientScriptBlock() 和 IsStartupScript() 方法。这样一来,验证 Web 控件就不会先花时间构建要发送的客户端代码,而是先检查是否已经存在使用关键字 ValidatorIncludeScript 注册的脚本。如果存在,控件就会放弃构建客户端脚本块,因为脚本块已经由页面上的其他验证控件构建了。

  因此,每次构建客户端脚本时,应该首先调用 IsClientScriptBlock() 或 IsStartupScript() 方法,以确定是否需要生成客户端脚本。在下面一节,我们将看到一些示例,在这些示例中,IsClientScriptBlock()、IsStartupScript() 方法先后与 RegisterClientScriptBlock() 和 RegisterStartupScript() 方法结合使用。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章