重新理解一遍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

posted @ 2015-09-18 23:08  newzhq  阅读(3673)  评论(0编辑  收藏  举报