ASP.NET in C#,ClientScript.RegisterStartupScript与ClientScript.RegisterClientScriptBlock用法之己见
ClientScript.RegisterStartupScript:
http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.registerstartupscript(v=vs.80)
ClientScript.RegisterClientScriptBlock:
http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.registerclientscriptblock(v=vs.80).aspx
ASP.NET中,可以使用这两个方法从后台向前台注册JavaScript脚本;
这两个方法,各自都有两个重载的版本,个人推荐始终使用四个参数的版本,本文基于四个参数的版本:
public void RegisterStartupScript(Type type, string key, string script, bool addScriptTags);
public void RegisterClientScriptBlock(Type type, string key, string script, bool addScriptTags);
如果addScriptTags==true,那么script会被包含在<script></script>元素块中;
如果addScriptTags==false,此时这两个方法相当于三个参数的版本,<script></script>元素块需自己写;
另外,如果想通过注册脚本的方式,在页面上输出html元素(如<h1>标题</h1>),可以把addScriptTags设置为false,在script中写html元素,例如:
ClientScript.RegisterClientScriptBlock(Page.GetType(), "write", "<h1>标题一</h1>", false);
当然了,不推荐这种做法了,因为太不灵活了,RegisterClientScriptBlock写的html元素只能在页面的顶部,RegisterStartupScript写的html元素只能在页面的底部;比较灵活的做法是,使用JavaScript操作DOM元素。
好了,来说说RegisterClientScriptBlock和RegisterStartupScript的不同点吧: 1. RegisterClientScriptBlock注册的脚本在<form>元素的后面,而RegisterStartupScript注册的脚本在</form>元素的前面:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ClientScript.RegisterClientScriptBlock(Page.GetType(), "", "alert('RegisterClientScriptBlock');", true);
ClientScript.RegisterStartupScript(Page.GetType(), "", "alert('RegisterStartupScript');", true);
}
}

生成的html:

<form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZFL5WzOc4Lk3midVVH7bOliUF/+AQZAXgy6DDne32SJ1" />
</div> <script type="text/javascript">
//<![CDATA[
alert('RegisterClientScriptBlock');//]]>
</script> <div>
</div> <script type="text/javascript">
//<![CDATA[
alert('RegisterStartupScript');//]]>
</script>
</form>

生成的html源代码清楚的展现了注册的脚本在页面上的位置;
说明:生成的html源代码中,紧跟在<form>后,在RegisterClientScriptBlock注册的脚本前的内容(可能还有其他的),是ASP.NET为了实现自身功能所必须的由系统自动生成的,如果撇开这些内容,可以认为RegisterClientScriptBlock生成的脚本是紧跟在<form>元素后的。 2. 因为RegisterClientScriptBlock与RegisterStartupScript注册的脚本的位置不同,导致两者使用的场合也有所不同:
1> RegisterClientScriptBlock注册的脚本是在DOM元素未完全加载前执行的,这就导致了,它无法访问页面中几乎所有的html元素;所以RegisterClientScriptBlock适合写JavaScript函数、警告(在用户点击“确定”之前,页面为空白);
2> RegisterStartupScript注册的脚本也是在DOM元素未完全加载前执行的,可是与RegisterClientScriptBlock不同的是,页面上的大部分DOM元素它都可以访问;所以RegisterStartupScript不太适合写JavaScript函数,可能调用它写的函数的时候,函数还没加载到页面上呢;
RegisterStartupScript也可以用来写警告,此时,即使用户没有点击“确定”按钮,也可以看到页面的内容;
※ 关于RegisterStartupScript写的警告(alert),如果</form>后面有JavaScript脚本(直接硬编码在页面上的),且此脚本是控制页面呈现样式的,那么在用户点击警告框中的“确定”按钮前,页面的呈现可能会非预期; 3. 如果注册的脚本的执行依赖于页面上的元素,或为了显示出预期的效果(上面提到的用户未点击“确定”按钮,页面呈现非预期),可以结合window.onload事件,如果使用了JQuery,可以把脚本包含在:
$(document).ready(function() {
// 这里
}); 4. 最后说一下RegisterStartupScript和RegisterClientScriptBlock函数的第二个参数key吧:
在页面加载或处理请求的过程中,执行了若干次RegisterStartupScript和RegisterClientScriptBlock方法,如果没有给该函数指定key,即key="",或key重复,因为相同key的脚本只会注册一次,重复注册的脚本会被忽略,如果出现了某些脚本未注册的情况,此时就需要检查是否出现了重复的key;RegisterStartupScript和RegisterClientScriptBlock的key可以重复,因为是不同的方法嘛!~
可以通过:
public bool IsStartupScriptRegistered(Type type, string key);
public bool IsClientScriptBlockRegistered(Type type, string key);
来检查是否注册了相应key的脚本,避免重复注册:
ClientScript.RegisterStartupScript(Page.GetType(), "alert", "alert('RegisterStartupScript');", true);
if (!ClientScript.IsStartupScriptRegistered(Page.GetType(), "alert"))
{
ClientScript.RegisterStartupScript(Page.GetType(), "alert", "alert('RegisterStartupScript_2');", true);
}
上面的示例只是为了讲解IsStartupScriptRegistered的用法,实际使用中,没有谁会写这么小白的用法!~
如果可以保证在页面加载或处理请求的过程中,只会调用一次RegisterStartupScript和RegisterClientScriptBlock方法,可以不指定key;
例如,处理表单数据,某个字段不符合要求时,提示:
if (string.IsNullOrEmpty(txtInput.Value.Trim()))
{
ClientScript.RegisterStartupScript(Page.GetType(), "", "alert('不可以为空!');", true);
return;
}
ASP.NET in C#,ClientScript.RegisterStartupScript与ClientScript.RegisterClientScriptBlock用法之己见的更多相关文章
- asp.net中Page.ClientScript.RegisterStartupScript用法小结(转)
//ASP.NET后台页面跳转 Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<scri ...
- Asp.NET利用ClientScript.RegisterStartupScript("")的同学,请注意!
如果你想要在aspx.cs 文件用利用 ClientScript.RegisterStartupScript(""); 方法动态在DOM中执行脚本(比如想要将后置代码中的验证结果信 ...
- asp.net中Page.ClientScript.RegisterStartupScript用法小结
ClientScript.RegisterStartupScript(Page.GetType(), "Show", "alert('" + l_strConf ...
- ClientScript.RegisterStartupScript 不起作用
asp.net webform 使用 ClientScript.RegisterStartupScript 不起作用 form 加上 runat="server",ok
- ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
ScriptManager.RegisterStartupScript方法 如果页面中不用Ajax,cs中运行某段js代码方式可以是: Page.ClientScript.RegisterStartu ...
- Page.ClientScript.RegisterStartupScript
Page.ClientScript.RegisterStartupScript方法最初可用的选项之一就是使用一个可实现此功能的 .NET 类来注册脚本块. 第一个是 RegisterStartupSc ...
- Page.ClientScript.RegisterStartupScript用法小结
使用类型.键.脚本文本和指示是否添加脚本标记的布尔值向 Page 对象注册启动脚本. 参数 type 要注册的启动脚本的类型. key 要注册的启动脚本的键. script 要注册的启动脚本文本. a ...
- (转)ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 方法
ScriptManager.RegisterStartupScript方法 如果页面中不用Ajax,cs中运行某段js代码方式可以是: Page.ClientScript.RegisterStartu ...
- Page.ClientScript.RegisterStartupScript不执行问题
c#后台使用Page.ClientScript.RegisterStartupScript在前台注册一段脚本提示,发现没有效果,寻寻觅觅,终于从度娘处找到了原因: 该页面多次使用到了Page.Clie ...
随机推荐
- Swift 学习笔记 (函数)
函数 函数是一个独立的代码块,用来执行特定的任务.Swift中的函数与Object-C中的函数一样,但是声明与书写的方式不太一样,现在我们就通过几个例子介绍一下Swift中的函数.简单的来说,他与JS ...
- Webpack探索【15】--- 基础构建原理详解(模块如何被组建&如何加载)&源码解读
本文主要说明Webpack模块构建和加载的原理,对构建后的源码进行分析. 一 说明 本文以一个简单的示例,通过对构建好的bundle.js源码进行分析,说明Webpack的基础构建原理. 本文使用的W ...
- 出版物排版软件——对XML数据进行排版、浏览、转换、打印
XML和XSL进行排版的功能强大的软件,并将排版结果进行打印或转换成各种各样的文件格式,满足各方需求. 随着出版物电子排版方式的普及,大部头出版物的排版,越来越多的应用在人们的工作中.比如,惠普公 ...
- 用JavaScript判断一个对象是否数组?
Q:如何判断一个对象是否为数组? A1:判断对象的constructor是否指向Array, 接着判断对应的特殊属性,如length,splice之类.这个很容易冒充. A2:使用instanceof ...
- 【Leetcode-easy】Remove Nth Node From End of List
思路1:设置两个指针p1,p2指向表头,p1先走n步.再两个指针同时走.当p1指针指到链表尾部时,P2指针已经在需要删除节点的前一位.一定要注意一些细节. class ListNode { int v ...
- Vue.js devtool插件安装后无法使用的解决办法
初次使用Vue.js devtool插件的新人在安装了Vue.js devtool插件后,都会经常有一个疑问.我在chrome浏览器里面已经成功安装好Vue.js devtool插件,怎么点击后提示v ...
- android使用mina需要注意的问题
1.第三方jar包的使用 如果在Java Build Path中使用Add External JARs这种方式,运行时会有找不到类的错误(我的上面有,如果你没出现,恭喜你),上网查了几种方 ...
- BZOJ_3671_[Noi2014]随机数生成器_set+贪心
BZOJ_3671_[Noi2014]随机数生成器_set Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第 ...
- ACM学习历程—BestCoder 2015百度之星资格赛1006 单调区间(组合数学)
Problem Description 百小度最近在逛博客,然后发现了一个有趣的问题. 如下图所示,是一个12 位数014326951987 , 它的数字先逐渐变大, 然后变小,再变大,接着变小,又变 ...
- windwos 10 谷歌浏览器出现彩色闪条
应该是上个星期五开始,发现电脑从别的地方切换到谷歌浏览器就会出现闪条,开始也没太注意,但是到周一还是这样,所以再网上查了下, 说什么的都有,什么你按脑屏幕坏了,内存条不行什么是的.后来才发现原来是谷歌 ...