假设有一个脚本(用js或者jQuery等类似手段编写),为UpdatePanel中的一个普通的TextBox赋值。如果你以为这样写:

<head runat="server">
    <title>Test</title>
    <script src="Scripts/jquery-2.0.0.js"></script>
    <script>
        $(function ()
        {
            $('#<%=TextBox1.ClientID%>').val("I'm Bill Gates!");
        });
    </script>
</head>

  你将发现程序一开始运行还正常,但是如果在UpdatePanel中加上一个Button,点击里边的Button之后TextBox1将不再存有文字。

  为什么呢?因为UpdatePanel是一个异步的回发页面。这个页面在初次加载的时候自然随着整个页面的刷新加载而加载,因此作用于页面级别的jQuery代码可以起到作用。但是等到点击button之后,仅仅是UpdatePanel中的内部内容刷新了,整个页面根本不刷新(换句话说,整个页面的jQuery根本没有执行)。因此没有任何作用了。

  解决方案就是设法获取异步页面的加载脚本事件,然后进行赋值:

<head runat="server">
    <title>Test</title>
    <script src="Scripts/jquery-2.0.0.js"></script>
    <script>
        $(function ()
        {
            $('#<%=TextBox1.ClientID%>').val("董玮……");
            var content = Sys.WebForms.PageRequestManager.prototype.add_endRequest(function(){$('#<%=TextBox1.ClientID%>').val("董玮……");});
        });
    </script>
</head>

  注意:“$('#<%=TextBox1.ClientID%>').val("I'm Bill Gates!");”这句话绝对不能省略,因为Sys.WebForms.PageRequestManager仅处理异步页面回发时候的情况。除此之外,另外微软还提供了一个Application类。

  其实这是微软已经封装的一个类,我们可以拿它和一般的服务端的Page类做一个类比,方便记忆(只不过一个处理服务端,一个是客户端而已):其中PageRequestManager位于Sys.WebForms下,必须通过getInstance方法获取单例之后使用,而Sys.Application可以直接使用。以下给出的是类比的一些“对等情况”:

        服务端类              客户端类

    Page类                  Application类  

Page_Init                      add_init方法        

Page_Load                   add_load方法

Page_Unload              add_unload方法

  对比这些方法,你发现Page的Load事件和客户端的Application的Load事件一样重要:前者是加载了全部的服务端控件之后可以开始在此写代码进行对服务端控件进行服务端的操作。后者则从客户端的角度(加载了所有Html以及服务端自动生成的脚本等),可以进行额外的控制了。一般我们开发人员主要考虑在这两个事件中处理事情居多。同样地,这两个事件:

 【相同点】一旦页面刷新,或者点击Submit页面导致整个页面回发,或者位于UpdatePanel中的按钮导致局部页回发,Page_Load和add_load照样执行。

 【不同点】Page_Load可以通过if(!IsPostBack){……}的方式判断是否回发。add_load未提供了类似机制判断局部页面是否回发。但是PageRequestManager却提供了一个方法(get_isInAsyncPostBack())来判断是否是第一次页面异步回发。如果把脚本注册代码仅写在这个方法块里边,和Page_Load那种效果一样,只注册一次脚本。所以根据情况而定。

  至于PageRequestManager的事件是针对UpdatePanel为主。有InitRequesting,BeginRequest,pageloading,pageload和endRequesting等事件。我们做一个实验,看看执行顺序:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="VB.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="Scripts/jquery-2.0.0.js"></script>
<script>
$(document).ready(function () {
Sys.Application.add_init(function () {
alert("add_Init");
});
Sys.Application.add_load(function () {
alert("add_Load");
});
var page = Sys.WebForms.PageRequestManager.getInstance();
page.add_initializeRequest(function ()
{
alert("page_Init");
});
page.add_beginRequest(function () {
alert("page_beginRequest");
});
page.add_pageLoading(function () {
alert("page_Loading");
});
page.add_pageLoaded(function () {
alert("page_Loaded");
});
page.add_endRequest(function ()
{
alert("page_endRequest");
});
});
</script>
</head>
<body onload="Myfun">
<form id="form1" runat="server">
<div> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div id="MyDiv"></div>
<asp:Button ID="Button1" runat="server" Text="Inner Button1" />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>

  实验结果:

页面刚加载的时候:先执行add_Init,然后page_loaded,最后add_Load。

  当点击Button的时候:1)page_Init 2)page_beginRequest 3)page_loading 4)page_loaded 5)add_load 6)page_endRequest。

  【结论】

  1、Application一般用于整个页面(凡是页面刷新或者回传,都会导致此事件发作)。Init只发生一次。load可以多次发生。

  2、PageRequestManager用于单个可以回发的控件(比如UpdatePanel)。初始化加载时候随着整个页面加载,因此page_loaded先加载完毕之后整个Application才加载完毕。单击Button的时候,就UpdatePanel回发,因此page方面的事件逐一被激发,最后重新加载UpdatePanel,然后Application的load事件才被激发(全部页面加载完毕)。

  有关于这些内容详细信息,可以参考MSDN:

  http://msdn.microsoft.com/zh-cn/library/bb398976(v=vs.100).aspx

  http://msdn.microsoft.com/zh-cn/library/bb310856(v=VS.100).aspx

原文:http://www.cnblogs.com/ServiceboyNew/archive/2013/05/04/3059014.html

使用脚本操作UpdatePanel中控件的问题的更多相关文章

  1. ASP.NET AJAX入门系列(4):使用UpdatePanel控件(一)

    UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...

  2. ActiveX控件的安全初始化和脚本操作 和 数字签名SIGN

    摘要:数字签名SIGN保证控件在下载时候的安全性.如果你的代码已经经过数字签名,即使用户IE的安全设置很高也能下载,安装并登记.但是在页面上初始化,或者用脚本运行这个控件,为了保证安全性,还需要进行M ...

  3. ScriptManager和UpdatePanel控件实现局部刷新

    ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果.其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因 ...

  4. form表单中控件较多,加载完成后切换页面都很慢的解决方法

    form表单中控件较多,加载完成后点击都很慢,为什么?我一页面中form表单里面上百个控件(如input.select.radio.checkbox等),还有一些js脚本,加载速度还可以,都能全部显示 ...

  5. 转载Ajax.Net--ScriptManager和UpdatePanel控件

    ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果.其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因 ...

  6. 多个UpdatePanel控件相互引发刷新的使用

    原文:多个UpdatePanel控件相互引发刷新的使用 ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果.其中的UpdatePanel就是设置页面中异 步局 ...

  7. 第八篇:SOUI中控件事件的响应

    SOUI中提供了大部分常用的win32标准控件的实现,如pushbutton, checkbox, radiobox, edit, richedit, listbox, combobox, treec ...

  8. 学习笔记:UpdatePanel控件

    Asp.net UpdatePanel 允许用户构建一个丰富的,以客户端为中心的应用程序,引用UpdatePanel控件,能够实现页面的部分刷新,一个包含scriptManage和 UpdatePan ...

  9. ASP.Net UpdatePanel控件(转)

      Asp.net UpdatePanel 允许用户构建一个丰富的,以客户端为中心的应用程序,引用UpdatePanel控件,能够实现页面的部分刷新,一个包含scriptManage和 UpdateP ...

随机推荐

  1. SQL Server 2012安装图文教程

    解析SQL Server 2012安装中心 当系统打开"SQL Server安装中心",则说明我们可以开始正常的安装SQL Server 2012了. SQL Server安装中心 ...

  2. MaxTemperature程序Mapper ClassNotFoundException

    错误: 执行hadoop权威指南上MaxTemperature程序出现Mapper类ClassNotFoundException异常: 解决: 将书上的 JobConf job = new JobCo ...

  3. aspnet_isapi.dll设置图文介绍.net的程序实现伪静态

    用URLRewriter控件 ①:首先要有这个文件URLRewriter.dll,如果没有,赶快到网上下载一个,并将其放到下面的bin目录里面,并且将其引用添加到下面里面; ②:下面就是Web.Con ...

  4. 有Maple T.A.自有试题图so easy

    对于想完全控制试题库的用户而言,Maple T.A.是最好的选择.不论您是要利用现有的题库,还是要创建自己的题库,Maple T.A.都可以为您提供功能强大.操作便捷的工具创建数学内容. 1) Ste ...

  5. ruby 访问新浪微博API post方式和get方式

    require 'net/https' require 'uri' def post_api(api, args) uri = URI.parse api http = Net::HTTP.new(u ...

  6. DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)

    前言: 趁着最近的休息时间,只能多勤快些:多写代码,多更新文章. 因为一旦投入新的工作,估计博客又会恢复到一年才产几篇的状态. 对于DBImport,因为用户的意见,增加了一个亮点功能,让软件B格升为 ...

  7. Expert 诊断优化系列------------------冤枉磁盘了

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  8. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  9. .Net开发笔记(十五) 基于“泵”的TCP通讯(接上篇)

    上一篇博客中说了基于“泵”的UDP通讯,附上了一个Demo,模拟飞鸽传书的功能,功能不太完善,主要是为了说明“泵”在编程中的应用.本篇文章我再附上一个关于TCP通讯的两个Demo,也都采用了“泵”模式 ...

  10. C#图片色彩的纠正-上

    WPF(C#)图片色彩的纠正-上 WPF(C#)图片色彩的纠正-下 前言 对图片进行色彩的纠正,其实与WPF是没有什么关系的,为什么标题又是“WPF(C#)图片色彩的纠正”呢,因为这些图片色彩的纠正功 ...