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" οnclick="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 标准的要求,大大减少了在客户端出现错误的机率。