假设有一个脚本(用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. Redis 的性能幻想与残酷现实

    2011 年,当初选择 Redis 作为主要的内存数据存储,主要吸引我的是它提供多样的基础数据结构可以很方便的实现业务需求.另一方面又比较担心它的性能是否足以支撑,毕竟当时 Redis 还属于比较新的 ...

  2. Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4

    Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4 Building O ...

  3. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  4. Java 8函数编程轻松入门

    函数接口介绍 在Java1.8中,新增了Lambda表达式.在.net3.5(C# 3.0)在原先的匿名方法基础上演变出了Lambda表达式.学过C# Lambda表达式的同学,对于Java的Lamb ...

  5. 在JS中获取文件点之后的后缀字符

    var upFileName = $("#fileToUpload").val();var index1=upFileName.lastIndexOf(".") ...

  6. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  7. 在JQ中关于this

    this的相关问题 this指代的是什么 这个应该是比较好理解的,this就是指代当前操作的DOM对象. 在jQuery中,this可以用于单个对象,也可以用于多个对象. $('btn').click ...

  8. 推荐两款简单好用的图片放大jquery插件

    一.zoomfiy.js 推荐可以从这里下载 使用说明: 使用该jquery 插件引入该插件的js:zoomfiy.js 或 min引入该插件的css:zoomfiy.css 或 min前后顺序都可j ...

  9. 阿里云centos7搭建wordpress环境

    阿里云搭建wordpress系统 一.购买阿里云 二.安装php开发环境 1. https://www.apachefriends.org/zh_cn/index.html网站下载linux下的xam ...

  10. ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询

    上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...