假设有一个脚本(用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. mongodb分片配置

    通过YUM库自动安装Mongodb 手动安装配置mongodb 验证mongodb主从复制过程 验证mongodb副本集并实现自动切换 实验mongodb使用gridfs存放一个大文件 1.创建数据目 ...

  2. USACO翻译:USACO 2013 JAN三题(1)

    USACO 2013 JAN 一.题目概览 中文题目名称 镜子 栅栏油漆 奶牛排队 英文题目名称 mirrors paint lineup 可执行文件名 mirrors paint lineup 输入 ...

  3. JQuery中的dialog使用介绍

    初始化参数 对于 dialog 来说,首先需要进行初始化,在调用 dialog 函数的时候,如果没有传递参数,或者传递了一个对象,那么就表示在初始化一个对话框. 没有参数,表示按照默认的设置初始化对话 ...

  4. Window平台Grmon下如何使用gdb进行调试

    Window平台Grmon下如何使用gdb进行调试 1输入cmd命令,打开其窗口,进入你要执行的文件目录下 2.连接开发板,输入grmon –altjtag –u 3.连上后,输入gdb命令 4.再输 ...

  5. [Unity3D]自己动手重制坦克舰队ArmadaTank(2)从碰撞说起

    [Unity3D]自己动手重制坦克舰队ArmadaTank(2)从碰撞说起 在上一篇里我给出了重制的坦克舰队效果图和试玩程序.本篇介绍一下玩家坦克和敌方坦克碰撞问题. +BIT祝威+悄悄在此留下版了个 ...

  6. 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...

  7. JS设计模式(一)

    刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...

  8. struts1四:常用标签

    struts1支持的5种标签: HTML 标签: 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 Bean 标签: 在访问JavaBeans 及其属性,以及定义一个 ...

  9. NodeJS中 package.json各属性分析

    package.json 中包含各种所需模块以及项目的配置信息(名称.版本.许可证等)meta 信息. Name:它属于必须字段,在package.json中最重要的就是name和version字段, ...

  10. Nginx服务器之基础学习

    一.Nginx介绍 nginx:Nginx是一种软件服务器(轻量级),故它最主要的功能就是可以与服务器硬件结合,我们的应用程序可以放在nginx服务器上进行发布,已达到让网民浏览的效果.除此自外,Ng ...