ASP.NET AJAX UpdatePanel控件
不論好壞,UpdatePanel控件都是 ASP.NET AJAX 社區(qū)所喜愛(ài)的。我說(shuō)“好”,是因?yàn)?UpdatePanel 使部分頁(yè)面呈現(xiàn)變得相當(dāng)簡(jiǎn)單,而說(shuō)“壞”,是因?yàn)樗暮?jiǎn)便和易用性是以效率和令人啼笑皆非的帶寬為代價(jià)的。
UpdatePanel 可以為一般的網(wǎng)頁(yè)帶來(lái) AJAX 神奇的好處,但是它不能提供我們與 AJAX 正常關(guān)聯(lián)的高效性。例如,您是否知道,當(dāng) UpdatePanel控件對(duì)服務(wù)器執(zhí)行異步 AJAX 回調(diào)以更新其內(nèi)容時(shí),這個(gè)請(qǐng)求包含了常規(guī) ASP.NET 回發(fā)所包含的一切,其中還包括視圖狀態(tài)呢?大多數(shù)開(kāi)發(fā)人員會(huì)以為 AJAX 取消了視圖狀態(tài)。而 UpdatePanel 的 AJAX 品牌卻并非如此。
如果您準(zhǔn)備使用 UpdatePanel控件,您需要清楚您在準(zhǔn)備干什么。在許多情況下,從性能的角度而言,應(yīng)用程序***是不使用 UpdatePanel,而是使用對(duì) WebMethods 或頁(yè)面方法的異步調(diào)用。這樣做可能會(huì)大幅度降低網(wǎng)絡(luò)傳輸中的數(shù)據(jù)量。但是,它也是一個(gè)根本轉(zhuǎn)變,在這里 UI 更新需要由開(kāi)發(fā)人員使用該頁(yè)面上的 JavaScript 來(lái)進(jìn)行顯式處理。
此外,ASP.NET AJAX 論壇上到處都有關(guān)于自定義 UpdatePanel 的提問(wèn)。其實(shí),只要您了解為 UpdatePanel 提供客戶(hù)端支持的 Microsoft? AJAX Library 中的 PageRequestManager、JavaScript 類(lèi),這里面許多問(wèn)題就可以迎刃而解。
既然已經(jīng)提供了 ASP.NET AJAX,我想進(jìn)一步檢查一下 UpdatePanel,從而進(jìn)一步了解您可以如何對(duì)其進(jìn)行自定義和優(yōu)化,甚至在沒(méi)有它的情況下如何運(yùn)行。這恰恰也是本期專(zhuān)欄包含的全部?jī)?nèi)容。
更新突出顯示
有時(shí)候您無(wú)法幫助 Microsoft 的開(kāi)發(fā)人員,而只能對(duì)他們表示遺憾。如果他們不能將工作做得足夠好,就會(huì)遭到公眾的抨擊。然而,有時(shí)候他們的工作做得很出色,也會(huì)遭到抨擊。例如,我最近收到了一位客戶(hù)的電子郵件,抱怨 ASP.NET AJAX UpdatePanel 運(yùn)行得有點(diǎn)過(guò)頭了。
UpdatePanel 使 ASP.NET 頁(yè)面回發(fā)到服務(wù)器,并將它變?yōu)榱鲿场o(wú)閃爍的更新時(shí)出現(xiàn)閃光和閃爍變得極其簡(jiǎn)單。UpdatePanel 可以通過(guò)將回發(fā)轉(zhuǎn)換成異步回調(diào)(XML-HTTP 請(qǐng)求),以及使用客戶(hù)端上的 JavaScript 以刷新由 UpdatePanel控件封裝的頁(yè)面的一部分來(lái)發(fā)揮它的魔力。閃光和閃爍會(huì)消失,因?yàn)闉g覽器不會(huì)將該頁(yè)面重新繪制成與它在回發(fā)期間的一樣。
客戶(hù)的抱怨是,用戶(hù)有時(shí)候不會(huì)注意到頁(yè)面的那個(gè)部分已經(jīng)更新了新內(nèi)容。他的問(wèn)題很簡(jiǎn)單:ASP.NET AJAX 團(tuán)隊(duì)的工作人員是否能使
updatePanel 閃爍再多一點(diǎn),以便用戶(hù)不會(huì)錯(cuò)過(guò)重要的更新?
不幸的是,ASP.NET AJAX 團(tuán)隊(duì)可能對(duì)制造 UpdatePanel 閃爍沒(méi)什么興趣。畢竟,消除閃爍才是發(fā)明 UpdatePanel 的初衷。但值得高興的是,您可以在瀏覽器中使用 AJAX 的一些神奇功能,以吸引對(duì)已更新的 UpdatePanel 的注意。秘訣在于 Microsoft AJAX Library(由客戶(hù)端一半的 ASP.NET AJAX 組成的 JavaScript 類(lèi)的庫(kù))中的 Sys.WebForms.PageRequestManager 類(lèi)。PageRequestManager 可以管理由 UpdatePanel 啟動(dòng)的異步回調(diào)。它還負(fù)責(zé)在異步回調(diào)完成后更新 UpdatePanel 內(nèi)的內(nèi)容。
PageRequestManager 可以在更新前和更新后激發(fā)瀏覽器中的事件。您可以將 JavaScript 中的這些事件關(guān)聯(lián)起來(lái),并運(yùn)行可以提醒用戶(hù)注意更新內(nèi)容的代碼。關(guān)鍵事件被命名為 pageLoaded.此事件每次都會(huì)激發(fā)瀏覽器中的頁(yè)面加載(它類(lèi)似 Page_Load in ASP.NET)。它每次還會(huì)激發(fā)代表 UpdatePanel控件完成而啟動(dòng)的異步回調(diào),并且會(huì)更新這個(gè) UpdatePanel 中的內(nèi)容。您可以使用兩行代碼(可以合并為一行)注冊(cè) pageLoaded 事件的 JavaScript 處理程序:
var prm = Sys.WebForms.PageRequestManager.getInstance();prm.add_pageLoaded(pageLoaded);
***行獲得對(duì)該頁(yè)面的 PageRequestManager 對(duì)象的引用。第二行注冊(cè)名為 pageLoaded 的 JavaScript 函數(shù),作為 pageLoaded 事件的處理程序。
調(diào)用時(shí),pageLoaded 事件處理程序會(huì)收到一個(gè) Sys.WebForms.PageLoadedEventArgs 類(lèi)型的參數(shù),它是 Microsoft AJAX Library 中的另一個(gè)類(lèi)。PageLoadedEventArgs 包含一個(gè) get_panelsUpdated 方法,您可以調(diào)用該方法來(lái)枚舉所有的 UpdatePanel(如果有),其內(nèi)容剛剛已更新。在默認(rèn)情況下,UpdatePanel 就是客戶(hù)端上的 DIV,因此您可以使用 JavaScript 來(lái)使該 DIV 閃光,突出顯示它,或?qū)λ鼒?zhí)行任何您想要的操作,以提醒用戶(hù)注意它。
【編輯推薦】


















