重新理解一遍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
重新理解一遍UpdatePanel的更多相关文章
- USB学习小记-HID类键盘的报告描述符的理解
前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...
- SQL Server 深入解析索引存储(下)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
- CSS浮动文摘
很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 写在前面的话: 由于CSS内容比较多,没有精力从头到尾讲一遍,只能有 ...
- css(一)
CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 1.行内式 ...
- CSS浮动(float,clear)通俗讲解
首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...
- 经验分享:CSS浮动(float,clear)通俗讲解
很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...
- 不可或缺 Windows Native (7) - C 语言: 指针
[源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...
- IIS5与IIS6 应用程序生命周期和页生命周期
在写这篇博客之前,知好多前辈已经写过,自己班门弄斧,主要是加深自己对细节的理解,另一方面希望对浏览此篇文章的读者一个新的认识.注定是一长篇.肯定有新的认识,图示都是原创. 此篇所有牵涉的细节,我会一一 ...
- kuangbin_ShortPath R (HDU 4370)
出题人真是脑洞堪比黑洞 (然后自己也被吸进去了 理解一遍题意 三个条件可以转化为 1的出度是1, n的入度是1, 2~n-1的出度等于入度 不难发现1-n的最短路符合题意 然而其实还有另一种情况 1为 ...
随机推荐
- iOS中通知的添加和移除
我们都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用.很多时候我们根据自身需要将相关代 ...
- noNamespaceSchemaLocation前添加xsi
在.Net中操作xml文档,给节点添加,xsi:noNamespaceSchemaLocation属性时,不可以使用 XmlElement eleRoot = doc.CreateElement(&q ...
- JavaScript鼠标事件,点击鼠标右键,弹出div
document.oncontextmenu = function(){return false}; //禁止鼠标右键菜单显示 var res = document.getElementById('b ...
- API例子:用Java/JavaScript下载内容提取器
1,引言 本文讲解怎样用Java和JavaScript使用 GooSeeker API 接口下载内容提取器,这是一个示例程序.什么是内容提取器?为什么用这种方式?源自Python即时网络爬虫开源项目: ...
- flask-sqlalchemy 关系表简单操作
from flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemyfrom flask.ext.migrate import Migr ...
- C++多态性中基类析构函数声明为虚函数
在用基类指针指向派生类时, 在基类析构函数声明为virtual的时候,delete基类指针,会先调用派生类的析构函数,再调用基类的析构函数. 在基类析构函数没有声明为virtual的时候,delete ...
- MYSQL 查看可用的字符集的 2 方法
方法 1. show character set; 方法 2. show collation;
- QT:轻松获取网页源码
获取网页源码的小例子,代码很简单,就不多作解释了. 不过一定要注意网页的编码问题,否则会出现乱码的!!! #include <QtCore> #include <QtNetwork& ...
- CSS 注意事项
使用css缩写 使用缩写可以帮助减少你CSS文件的大小,更加容易阅读. 明确定义单位,除非值为0 忘记定义尺寸的单位是CSS新手普遍的错误.在HTML中你可以只写width="100&q ...
- JAVA反射学习网摘
程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动 ...