重新理解一遍UpdatePanel

楼主只是想每天写点东西这样帮助自己的一个累积吧。

说明:楼主现在已经清楚了AJAX是怎么回事了,现在由于工作原因又摆弄起了UpdatePanel所以从AJAX的角度来分析一下UpdatePanel的使用。

原因:分到手里的一个项目是WebForm的用到了UpdatePanel,再加上当初在用这个UpdatePanel的时候确实没搞清楚。

好了闲话少说,就来聊聊这个当初让我没理解清楚的这个控件吧,说实话我觉得AJAX理解起来很容易,但是UpdatePanel确实让我当时很困惑。

太学术的什么的我也不想说了,楼主一贯的理念就是怎么样简单的描述一个事情。

AJAX怎么工作:

以前我们的页面就是发送请求给应用服务器,应用服务器计算响应,发个反馈给浏览器。这个应用服务器计算响应到最终发送浏览器的过程,用户操作的浏览器处于停滞等待状态,这种体验很不好。

所以后来大家想到了AJAX,其实就是有一个叫XMLHttpRequest这个一个东西,浏览器跟他说你给我提交个东西给应用服务器,应用服务器反馈给你东西了你就跟我讲,然后我来处理。而这个过程中浏览器不会处于等待状态,用户可以一直操作,并且XMLHttpRquest接受到服务器端的东西的后(可以是JSON也可以是XML,或者字符串),浏览器会选择刷新一些页面元素(DOM)也可以叫局部刷新吧。

我估计不用我多说大家应该都懂,但是我这里描述主要是为了说明后面的UpdatePanel怎么做的。

那么我们来分析一下要完成AJAX需要哪几部操作。

1、你需要一个触发(触发AJAX请求)。

2、你需要一个服务器端的服务(可以是ASHX或者ASPX,只要是服务就行了)

3、得到返回内容你得刷新前台的页面元素(DOM),其实我们代码中实现的时候是放在触发的回调里面的,这边为了理解UpdatePanel,分开说吧。

还是用jQuery写个栗子吧。

    $.post("请求的服务器服务", {传递的参数},function (data) {
        //得到返回修改dom
    })

上面的代码只包含了上面说的2,3两点,至于1很好理解,你这个jQuery方法总得要个按钮或者其他的触发吧。

UpdatePanel是怎么干的

其实UpdatePanel最终要完成的就是我上面说的那几步,但是如何完成呢。(ScriptManager需要配套使用)

UpdatePanel其实是在圈地,他在页面里面圈的内容就是回调要刷新的内容,这个很好理解UpdatePanel就是为了局部刷新而存在,但是其实感觉肯定没有回调自己来处理自由,但是你既然让别人封装你肯定要牺牲点自由了。

1、那么问题来了,地圈完了已经知道哪些地方要局部刷新了,那么如何来触发请求进行局部刷新呢?这时候有个缺省约定,就是UpdatePanel认为他内部的一些服务器端控件是可以触发请求的,例如:UpdatePanel内的一个按钮。 (其实这些请求触发,以及发送都是通过 ScriptManager服务器控件和客户端 PageRequestManager 类来协调,这其实就是ScriptManager为什么要配套使用的原因)。

2、那么问题继续来了,我现在觉得并不一定是在UpdatePanel内的按钮才能触发UpdatePanel的局部刷新,外面的应该也行呀。想想场景我点击一个按钮,局部刷新一个列表。好的这个是用ScriptManager上场了,不能引用了不用呀,你可以通过ScriptManager的RegisterAsyncPostBackContorl(你的那个按钮),你这个按钮就可以异步请求按钮的处理事件,就可以局部刷新了。

3、那么问题继续来呀,我现在在UpdatePanel里面有个按钮,但是我还是希望他能同步提交全局刷新一下,比如UpdatePanel中有个导出Excel按钮,不过默认的情况是内部的按钮都是异步的,那么怎么办呢,一样用ScriptManager的RegisterPostBackContorl注册这个按钮是同步提交了。当然你也可以在UpdatePanel里面注册异步,外面注册同步,虽然没卵子用,但是你要这么写也没什么办法。

4、那么问题继续来了,这里我们就来讨论UpdatePanel他那牛B的属性了,首先第一个UpdatePanel有个UpdateMode,有两个选项,一个是Always,一个是Conditional,这是啥屌意思呢,一个是总是,一个是有条件的。咋理解其实是这样的,一个页面其实可以有很多的UpdatePanel,那么Always是什么意思呢,意思就是当有异步请求回调的时候(就是异步回来的时候要开始刷新页面了)Always就是谁异步我都刷新,Conditional很显然的他肯定是跟Always不一样的,所以他一般是什么样的呢。1、当前UpdatePanel异步我才刷新即我圈地里面的异步我才刷新,2、叫我刷新也行,显式调用Update方法,XXupdatePanel.Update(),3、我爹刷新我也刷新,当然全局刷新肯定刷新这个UpdatePanel,不过这里说的其实是他的父UpdatePanel。目的其实就是异步的时候向服务器少要点东西,占用资源少点。

5、继续聊另外一个属性吧。ChildrenAsTriggers其实这个就是UpdatePanel圈地内的控件能触发自己的属性,这个缺省值是true,是什么意思呢,很明白了就是我儿子(圈地内容)能触发异步并且刷新我自己,至于刷不刷别人看别人的UpdatePanel的UpdateMode是怎么设置的。那么为false是什么情况,还有就是API中特地提到UpdateMode为Always但是ChildrenAsTriggers为false会报错,首先先理解ChildrenAsTriggers为false什么意思,其实即使为false内部按钮也会发异步请求也发了,但是意思是不刷新自己所在的UpdatePanel容器,这时候问题就来了,UpdateMode设置成Always意思就是谁异步我都刷新,ChildrenAsTriggers为false就是我儿子异步都不能刷新我,所以前后矛盾。那么ChildrenAsTriggers为false到底什么时候使用呢,其实是在两个UpdatePanel当然没有嵌套关系,A希望刷新B但是自己不刷新。这时候就会需要这个属性,例如:我们左侧有个菜单是异步出来的,右边有个列表是异步出来的,我们希望左边点菜单按钮的时候刷右边的列表就可以这么用。

至于UpdatePanel内部可以显式的写一些trigger这个大家自己理解一下吧,其实就是跟ScriptManager的去注册一个控件同步和异步是一样的。

小编很LOW都2015年了还摆弄这么老的技术,但是工作需要,只有工作需要的技术才是好技术。

20150918->1

时间: 2024-10-24 14:29:21

重新理解一遍UpdatePanel的相关文章

野兽的Angular Api 学习、翻译及理解 - - $rootScope.Scope

野兽的ng api学习 -- $rootScope.Scope 这里讲的是一些scope的操作,如创建/注销/各种监听及scope间的通信等等. $rootScope.Scope 可以使用$injector通过$rootScope关键字检索的一个根作用域. 可以通过$new()方法创建子作用域.(大多子作用域是在HTML模板被执行编译时自动生成) 格式:$rootScope.Scope([Providers],[instanceCache]) [Providers]:当前作用域需要被提供的服务工

Android消息传递源码理解。Handler,Looper,MessageQueue,Message

Android中消息传递模块差不多看了好几次,虽然每次看的方式都差不多但是还是发觉的到每次看了之后,理解的更清晰一点. 关于这个模块的文章数不胜数,但是最重要的还是自己动手理解一遍更好. 会牵扯到的几个类: Handler.java  , Looper.java , MessageQueue.java , Message.java 源代码路径: xxx/frameworks/base/core/java/android/os  看的过程中你会发现高版本和低版本系统代码有些地方比较大的差距.从中我

MVP模式(2) 你真的理解下抽象类和接口吗??

转载请注明出处:王亟亟的大牛之路 礼拜5下午,有一些小伙伴在讨论关于"我对MVP的理解啊","我对RxJava,RxAndroid的理解啊"等等.在交流中发现,其实我们往往在实际开发中有意无意的都可能出现某个类特别的繁杂,代码特别的多,而且其实很多都是重复的,但是又没有办法,诸如一大堆回调. 可能在项目构建之初,想着我要如何如何去实现,如何如何优化代码结构,逻辑等等,可是因为理解或者业务繁重等各个因素,导致到后来还是挤成一坨龙猫,像这样(麦麦胖的脚都看不见了,臃肿,

CSS浮动(float,clear)通俗讲解

很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多,小菜没有精力从头到尾讲一遍,只能有针对性的讲解. 如果读者理解CSS盒子模型,但对于浮动不理解,那么这篇文章可以帮助你. 小菜水平有限,本文仅仅是入门教程,不当之处请谅解! 本文以div元素布局为例. 教程开始: 首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下

分治策略 - 最大子序列问题

自开始学习算法起,我感觉就是跪着把<算法导论>的代码看一遍.理解一遍然后敲一遍...说实话自己来写并且要求时间复杂度达到要求,我肯定是不能做到的,但我想前辈们辛苦积累的研究成果贡献出来也是为了让后人少走一些弯路,所以我的作用就是把前辈们的成果学习之后加以理解,然后积累经验,领悟到他们解决问题时的思路和灵感.还有就是把个人理解后的知识存储在不会忘记的地方作为复习备用... 当然什么是写博客呢,我个人认为是把所学的知识加上自己的理解然后用较为通俗的语言来解释一遍,至少这样才有可能把学到的东西变为自

寻找子字符串——上

第十一章的习题7,刚开始觉得简单,可是实际思考时发现要考虑很多东西,然后脑子就一片混沌了,然后问题一拖一个月,然而时间并没有帮我解决掉问题,问题还是要自己去努力接触才能发展的呀. 有参考答案,上网也找到了答案,昨天验证了下,是对的.自己就是眼高手低,还犟,想凭借自己的"智慧"想出来(别人的我看了觉得费劲,而且很难理解他的思想,他到底是怎么想到的呢).不过不能自负,遇到问题想不出来很正常,就该学习自己想不到的思路,改变自己的思维方式.应该向前人学习,可以先读懂,理解一点是一点,接触多了自

小猪的Android入门之路 Day 8 part 2

小猪的Android入门之路 Day 8 part 2 Android网络编程浅析--Android访问网络资源 --转载请注明出处:coder-pig 本节引言: 在part 1中我们学习了网络交互中用得较多的xml文件的相关概念,以及在Android中常用的 解析XML三种不同形式,分别SAX,DOM,Pull三种不同的解析方式;而在part 2中我们将会 讲解我们的应用如何去获取网络上的资源,分别是图片,HTML代码,XML代码和JSON数据; 好了,废话就这么多,开始本节的课程吧!从这p

基础组件RectTransform

RectTransform组件是Unity编辑器下UGUI系统基本组件,深入理解RectTransform组件是用好UGUI的基本前提. 首先我们知道UI呢首先要就有坐标属性,这样我们才能确定它的位置.其次UI还要控制大小,是一个二维坐标在控制大小.这样一个UI元素才能在屏幕上显示.那么我们原先的组件transform就不能满足条件了,RectTransform就应运而生了.它继承自Transform组件,配合Canvas的使用. 先罗列一下RectTransform的属性:position,l

[NYIST737]石子合并(一)(区间dp)

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737 很经典的区间dp,发现没有写过题解.最近被hihocoder上几道比赛题难住了,特此再回头重新理解一遍区间dp. 这道题的题意很明确,有一列石子堆,每堆石子都有数量,还有一个操作:相邻两堆石子合并成一堆石子,这个操作的代价是这两堆石子的数目和.要找一个合并次序,使得代价最小,最终输出最小代价. 这个题可以用动态规划,简单分析可以得知,这一列石子堆都可以划分为小区间,每个小区间