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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM