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

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/newzhq/p/4820618.html
Copyright © 2020-2023  润新知