Response.Write 与   Page.ClientScript.RegisterStartupScript 与 Page.ClientScript.RegisterClientScriptBlock 之间的区别

方法1,使用Response.Write,这种方法会把JS代码写在页面的最顶部(<html>的前面):
System.Web.HttpContext.Current.Response.Write("<script language=javascript>alert(JS代码);</script>");

方法2,使用RegisterStartupScript,这种方法会把JS代码嵌入在页面的底部、表单的最后 (</form>前面),适用于要在页面控件加载完成后运行的JS代码 :
System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler;
if (!page.ClientScript.IsStartupScriptRegistered(page.GetType(),"clientScript"))
   
page.ClientScript.RegisterStartupScript(page.GetType(),
"clientScript", "<script
language=javascript>alert(JS代码);</script>");

方法3,使用RegisterClientScriptBlock,这种方法会把JS代码嵌入在页面的顶部、表单的最前 (<form>后面),适用于要在控件加载前执行的JS代码,类似于上面的Response.Write方式 :
System.Web.UI.Page page = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler;
if (!page.ClientScript.IsClientScriptBlockRegistered(page.GetType(),"clientScript"))
   
page.ClientScript.RegisterClientScriptBlock(page.GetType(),
"clientScript", "<script
language=javascript>alert(JS代码);</script>");

  那么,方
法2和方法3之间有何不同呢?主要区别在于,RegisterStartupScript 方法是将 JavaScript 嵌入到 ASP.NET
页面的底部,恰好位于关闭元素 </form> 的前面。RegisterClientScriptBlock 方法是将
JavaScript 嵌入到页面中开启元素 <form> 的紧后面。那么,这有何不同呢?正如我们将要看到的,这有很大的不同。

就此列举一例,以下是在页面加载到浏览器时,将焦点置于该页面上的一个文本框中的方法 - 使用利用了 RegisterStartupScript 方法的 Visual Basic:

Page.ClientScript.RegisterStartupScript(Me.GetType(),
"Testing", _   "document.forms[0][TextBox1].focus();",
True)由于在浏览器运行到页面底部并执行此小段 JavaScript
时,就已生成了页面上的文本框,并已将其放到了页面中,因此,此方法运行正常。但是,如果不按照上述方法,而编写如下代码(使用
RegisterClientScriptBlock 方法):

Page.ClientScript.RegisterClientScriptBlock(Me.GetType(),
"Testing", _ "document.forms[0][TextBox1].focus();",
True)文本框控件将不会获得焦点,且会在页面上生成一个 JavaScript 错误。

Page

大家都知道向客户端输出内容的方式很多,而打多少初学者会使用Respone.Write(string)。比如:

Respone.Write(“hello word!”);

或输出JS

Respone.Write("<script type='text/javascript'>alert('hello word!');</script>");

但是,当你查看客户端源码时,你会发现,输出的内容呈现在源码的最前端,显然它破坏了HTML的格式,在某些情况下这是会影响到页面布局等效果的。

正确的输出方式应该是:this.ClientScript.RegisterStartupScript或this.ClientScript.RegisterClientScriptBlock.

this.ClientScript.RegisterStartupScript 是在Form开始的第一行注册脚本,后者则是在Form结尾处注册脚本。这样就不回破坏HTML得格式了,如:

this.ClientScript.RegisterStartupScript(this.GetType(), "scriptKey", "<script type='text/javascript'>alert('hello word!');</script>")

this.ClientScript.RegisterStartupScript(this.GetType(), "scriptKey", "alert('hello word!');",True)

this.ClientScript.RegisterClientScriptBlock也类似。

UpdatePanel

当你想在UpdatePanel内输出一段JS时,运用以上方法就会得不到预期的效果。那么请看一下示例。

有一个UpdatePanel的ID是upPn

System.Web.UI.ScriptManager.RegisterClientScriptBlock(upPn,this.GetType(), "scriptKey", "alert('hello word!');",True)

System.Web.UI.ScriptManager.RegisterStartupScript(upPn,this.GetType(), "scriptKey", "alert('hello word!');",True)

这样的话,当UpdatePanel内容加载到客户端后,就会弹出“hello word!”对话框。

这样的话,从后台输出JS就更加方便了。

报错错误例:

消息: Sys.WebForms.PageRequestManagerParserErrorException: 未能分析从服务器收到的消息。

首先不能与这类AJAX控件共存
<RadAjax:RadAjaxManager ID="RadAjaxManager1" runat="server">
<AjaxSettings>
<RadAjax:AjaxSetting AjaxControlID="Button1">
<UpdatedControls>
<RadAjax:AjaxUpdatedControl ControlID="rcaldate" />
<RadAjax:AjaxUpdatedControl ControlID="rcbsex" />
<RadAjax:AjaxUpdatedControl ControlID="rtxtmemberid" />
<RadAjax:AjaxUpdatedControl ControlID="rcbxiaoshouyuan" />
<RadAjax:AjaxUpdatedControl ControlID="rtxtlastjifen" />
<RadAjax:AjaxUpdatedControl ControlID="rtxtlastjfmoney" />
<RadAjax:AjaxUpdatedControl ControlID="rcbprice" />
<RadAjax:AjaxUpdatedControl ControlID="rcbvip" />
<RadAjax:AjaxUpdatedControl ControlID="rtxtfangjia" />
</UpdatedControls>
</RadAjax:AjaxSetting>
</AjaxSettings>
</RadAjax:RadAjaxManager> 在用Response.Redirect()或Response.Write()进行URL带参数的页面重定向时出现如题所示的错误。
1:Ajax是无刷新的,而使用Response进行带参重定向时需要刷新页面。所以只须在UpdatePanel下设置“asp:PostBackTrigger”的“ControlID”为指定的控件名称即可,如:
<Triggers>
<asp:PostBackTrigger ControlID="btnSave" />
</Triggers> 2:如果你用的是微软的ajax框架,弹出提示框应该用:
ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "updateScript", "alert('对不起,账号和密码错误');", true); 3:EnableEventValidation="false"

System.Web.UI.ScriptManager.RegisterClientScriptInclude 后台加载JS文件

  string _RootPath = HttpContext.Current.Request.ApplicationPath;
// Define the name, type and url of the client script on the page.
String csname = "ButtonClickScript";
String csurl = _RootPath + "script_include.js";
Type cstype = this.GetType(); // Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript; // Check to see if the include script exists already.
if (!cs.IsClientScriptIncludeRegistered(cstype, csname))
{
cs.RegisterClientScriptInclude(cstype, csname, csurl);
}

asp.net中使用updatepanel 来实现异步导致js无效

asp.net做网站,为了简单,ajax直接使用了updatepanel来处理,结果updatepanel中的js效果,第一次加载是有效的,一旦updatepanel中使用了异步事件,js就无效了。网上找了一些答案,还是有效的。分享一下。

因为Updatapanel没有postback,你的js不会重新加载。所以失效。你在你的页面加一段这样的代码就可以了: <script type="text/javascript" language="javascript">

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_endRequest(function () {

// re-bind your jquery events here

$(document).ready(function(){

//页面中需要处理的js代码

});

});

</script>

上面这个问题,能解决自己编写的js(类似函数调用),但有些效果是直接通过引用外站提供的js代码,并没有任何调用(应该在引入的js脚本中实现了调用),上面的就没法处理了。

没有办法的办法,就是页面多写几个updatepanel,把有js的部分跳过。

其它方法:

/*方法一、*/
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<input src="../../../images/ico/ico_delete.gif" onload="reBindDatepicker()" style="display: none" id="Image1" type="image" />
</ContentTemplate>
</asp:UpdatePanel> <script type="text/javascript">
function reBindDatepicker() {
$(document).ready(function() {
//...
});
}
</script> /*方法二、*/
$(document).ready(function() {
// bind your jQuery events here initially
}); var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_endRequest(function() {
// re-bind your jQuery events here
});

the solution is from :
http://elves.cnblogs.com/

消息: Sys.WebForms.PageRequestManagerParserErrorException: 未能分析从服务器收到的消息。

ASP.NET后台输出js大全,页面顶部、form表单中前面与后面、和UpdatePanel(ScriptManager、AJAX)输出JS的更多相关文章

  1. asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)

    原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...

  2. 当一个页面中有多个form表单并且有重名的元素时,js获取指定form表单中的指定元素

    有时候我们会在一个页面中写了多个form表单,碰巧多个form表单中又有相同名称的元素,而我们又不想改名字,这个时候就能用到 $("#form1 #div1").val() 好玩吧 ...

  3. jQuery中设置form表单中action值与js有什么不同。。。。

    jQuery中设置form表单中action值与js有什么不同.... HTML代码如下: <form action="" method="post" i ...

  4. MSCRM4.0如何使js事件在批量编辑表单中触发

    MSCRM4.0如何使js事件在批量编辑表单中触发 MSCRM4.0如何使js事件在批量编辑表单中触发 MSCRM3.0我们可以通过在onload事件加入以下代码来控制某个属性为只读.crmForm. ...

  5. form表单中的button自动刷新页面问题

    form表单中如果存在button的话,有可能会出现一个问题:点击button,触发了页面的自动刷新事件. 原因是因为<button>标签默认的类型是submit,即默认的button点击 ...

  6. js控制页面显示和表单提交

    早期的web页面在显示方面一般在后台进行控制,虽然对后台开发来讲是比较容易做到的,但是涉及到一个问题,那就是数据库压力. 因为要控制显示,所以会比较频繁的从数据库中来回调用. 现在的js功能越来越强, ...

  7. 纯js将form表单的数据封装成json 以便于ajax发送

    使用方式: var json = form2Json("formId");//这里的参数是form表单的id值 form2json.js function form2Json(fo ...

  8. js 取值&赋值-form表单

      form表单元素介绍 CreateTime--2016年9月22日10:25:54 Author:Marydon <form> 表单元素. 表单中的元素: <input>表 ...

  9. 防止表单提交时刷新页面-阻止form表单的默认提交行为

    最近在写 ajax 提交的时候遇到一个问题,在执行 ajax 提交之后,浏览器页面自动刷新了,主要是没有 由于form 表单的默认提交行为.一下是几种阻止 form 表单默认提交行为的方式. 1.使用 ...

随机推荐

  1. 深入JVM-性能监控工具

    一.Linux下的性能监控工具 1.1 显式系统整体资源使用情况-top命令 top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息. 在统计信息中,第一行是任务队列信息,他的结 ...

  2. 10 months then free? 10个月,然后自由

    Parole board to recommend Oscar Pistorius be released in August 假释委员会将建议奥斯卡·皮斯托瑞斯在8月份被释放 By Don Melv ...

  3. 转:遗传算法解决TSP问题

    1.编码 这篇文章中遗传算法对TSP问题的解空间编码是十进制编码.如果有十个城市,编码可以如下: 0 1 2 3 4 5 6 7 8 9 这条编码代表着一条路径,先经过0,再经过1,依次下去. 2.选 ...

  4. C#读写文本和连接数据库

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. curl方式创建elasticsearch的mapping

    curl方式创建elasticsearch的mapping curl -XPUT 'http://192.168.1.105:9200/bank/item2/_mapping' -d '{ " ...

  6. Memcached深度分析

    Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东西,相信很多人都用过,本文意在通过对 ...

  7. matlab————矩阵输出到txt

    matlab如何输出矩阵到txt并指定数的精度 (2013-11-20 16:50:43)转载▼ 标签: matlab 输出数据 假设你的数据矩阵为a; [m n] = size(a); [filen ...

  8. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  9. python版本升级及pip部署方法

    Python版本升级 CentOS 6.3自带的Python版本为2.6,首先需要升级到2.7版本.由于旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装. 1.下载Pyt ...

  10. 【phpcms-v9】phpcms-v9二次开发所必须知道的步骤(转载)

    一.做phpcms-v9二次开发时,我们经常需要用到如下代码,所以有必须在这里注释说明一下 defined('IN_PHPCMS') or exit('No permission resources. ...