ClientScriptManager.RegisterStartupScript

ClientScriptManager.RegisterStartupScript 方法 (Type, String, String, Boolean)

 

参数

type
类型:System..::.Type

要注册的启动脚本的类型。

key
类型:System..::.String

要注册的启动脚本的键。

script
类型:System..::.String

要注册的启动脚本文本。

addScriptTags
类型:System..::.Boolean

指示是否添加脚本标记的布尔值。

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

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

应用实例:1

<%@ Page Language="C#"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
  public void Page_Load(Object sender, EventArgs e)
  {
    // Define the name and type of the client scripts on the page.
    String csname1 = "PopupScript";
    String csname2 = "ButtonClickScript";
    Type cstype = this.GetType();

    // Get a ClientScriptManager reference from the Page class.
    ClientScriptManager cs = Page.ClientScript;

    // Check to see if the startup script is already registered.
    if (!cs.IsStartupScriptRegistered(cstype, csname1))
    {
      String cstext1 = "alert('Hello World');";
      cs.RegisterStartupScript(cstype, csname1, cstext1, true);
    }

    // Check to see if the client script is already registered.
    if (!cs.IsClientScriptBlockRegistered(cstype, csname2))
    {
      StringBuilder cstext2 = new StringBuilder();
      cstext2.Append("<script type=\"text/javascript\"> function DoClick() {");
      cstext2.Append("Form1.Message.value='Text from client script.'} </");
      cstext2.Append("script>");
      cs.RegisterClientScriptBlock(cstype, csname2, cstext2.ToString(), false);
    }
  }
</script>
<html  >
  <head>
    <title>ClientScriptManager Example</title>
  </head>
  <body>
     <form id="Form1"
         runat="server">
        <input type="text" id="Message" /> <input type="button" value="ClickMe" onclick="DoClick()" />
     </form>
  </body>
</html>

应用实例2:

我见过很多ASP.NET 开发者都喜欢在页面的某些方法中使用Response.Write 方法直接往响应流中输出脚本或其他内容,比如:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("<script>alert('Hello world!');</script>");
}
这一段代码在像IE 这样的比较宽松的浏览器中确实能“很好”地工作
但是这段代码也许会让一个支持XHTML 的手机浏览器死机,因这个页面最终呈现这样的客户端代码:
<script>alert('Hello world!');</script>
<!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>
......

可以看到PageLoad 方法中输出的脚本代码出现在页面最前端,独立于整个文档结构。由于这句代码,整个文档已经不是一个合法的xHTML 文档,因为XML要求<!DOCTYPE>语句应该在文档的最前面。

回 顾页面生命周期,页面的内容在执行Render()方法时呈现到客户端,它是页面生命周期中最后阶段执行的方法,远远晚于PageLoad 和各个控件的回传事件,所以我们在PageLoad 或ButtonClick 这些事件处理程序中用Response.Write()方法输入的内容将出现在客户端代码的最前端,最终破坏整个页面结构。
所以用Response.Write()方法输出内容是一个非常差的主意。

要往页面中呈现脚本,我们可以选择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="/wEPDwUJN
zgzNDMwNTMzZGTx6EI+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 @ 2012-03-01 10:00  晴天有时下鱼  阅读(204)  评论(0编辑  收藏  举报