生活随笔
收集整理的這篇文章主要介紹了
拥抱变化——从Atlas到ASP.NET AJAX(4):大大简化的了的Extender扩展器控件
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
閱讀本文之前,您需要安裝完成Microsoft ASP.NET AJAX v1.0 Beta(詳見(jiàn)擁抱變化——從Atlas到ASP.NET AJAX(1):下載安裝總覽)。安裝完成之后,Visual Studio中新建Web Site的時(shí)候會(huì)多出一個(gè)模版:ASP.NET AJAX Enabled Web Site。接下來(lái)的內(nèi)容均將基于新建的ASP.NET AJAX Enabled Web Site。
?
摘要
在ASP.NET AJAX中,Extender Control(擴(kuò)展器控件)同樣很重要。如果說(shuō)UpdatePanel只是將Ajax的核心概念和基本特性——局部更新和異步回送引入了ASP.NET的話,那么擴(kuò)展器控件則在這個(gè)基本特性上邁出了新的一步——為頁(yè)面添加豐富的客戶端功能,讓用戶一眼就能夠看出來(lái):噢,這個(gè)網(wǎng)站真的太“Ajax”了!
本文將分析相對(duì)于從Atlas到ASP.NET AJAX中擴(kuò)展器控件使用方法的變化。
?
擴(kuò)展器控件介紹
ASP.NET AJAX提供了兩種內(nèi)建的擴(kuò)展器控件:DragOverlayExtender和AutoCompleteExtender,前者讓用戶可以將頁(yè)面中的某個(gè)部分在其中任意拖動(dòng)并排布,而后者可以為某個(gè)TextBox添加自動(dòng)完成的功能。這樣,該TextBox將擁有類似瀏覽器地址欄的行為,用戶輸入一段文字后會(huì)自動(dòng)彈出與之匹配的提示選項(xiàng)。關(guān)于CTP版本的AutoCompleteExtender使用方法,請(qǐng)參考使用ASP.NET Atlas AutoComplete Behavior或AutoComplete Extender實(shí)現(xiàn)自動(dòng)完成功能(上)以及使用ASP.NET Atlas AutoComplete Behavior或AutoComplete Extender實(shí)現(xiàn)自動(dòng)完成功能(下)。
擴(kuò)展器控件的實(shí)現(xiàn)原理也不復(fù)雜:ASP.NET AJAX將在生成HTML時(shí)將ASP.NET頁(yè)面中定義的擴(kuò)展器控件轉(zhuǎn)化為ASP.NET AJAX客戶端行為(Behavior)的聲明,并添加到頁(yè)面中,除此之外的所有實(shí)現(xiàn)均由ASP.NET AJAX的客戶端運(yùn)行時(shí)處理。當(dāng)頁(yè)面到達(dá)客戶端之后,客戶端的ASP.NET AJAX框架將在客戶端運(yùn)行該行為。關(guān)于ASP.NET AJAX客戶端行為,請(qǐng)參考在ASP.NET Atlas中創(chuàng)建自定義的Behavior(注意,該文章基于CTP版本書(shū)寫(xiě),部分內(nèi)容已經(jīng)過(guò)時(shí))。
另一個(gè)微軟公司和社區(qū)共同開(kāi)發(fā)的免費(fèi)開(kāi)源的第三方控件包——ASP.NET AJAX Control Toolkit則提供了更多、甚至可謂包羅萬(wàn)象的擴(kuò)展器控件,幾乎覆蓋了常用的各種富客戶端功能,并且還在迅速增加中。而這些控件使用起來(lái)又和ASP.NET AJAX內(nèi)建的擴(kuò)展器控件完全一致,讓開(kāi)發(fā)人員倍感親切。ASP.NET AJAX Control Toolkit中提供的這些擴(kuò)展器控件將在本卷第7、8、9、10章中詳細(xì)介紹。ASP.NET AJAX Control Toolkit還提供了擴(kuò)展器控件的基礎(chǔ)開(kāi)發(fā)設(shè)施(控件基類等)以及Visual Studio中的項(xiàng)目模版等。借助于這些便利的設(shè)施,我們也可以容易地進(jìn)行自定義控件的開(kāi)發(fā)。關(guān)于服務(wù)器端擴(kuò)展器控件的開(kāi)發(fā),請(qǐng)參考開(kāi)發(fā)ASP.NET Atlas服務(wù)器端Extender控件——基本概念以及預(yù)先需求、開(kāi)發(fā)ASP.NET Atlas服務(wù)器端Extender控件——編寫(xiě)客戶端Behavior、開(kāi)發(fā)ASP.NET Atlas服務(wù)器端Extender控件——編寫(xiě)服務(wù)器端Extender & Dflying近期動(dòng)向以及開(kāi)發(fā)ASP.NET Atlas服務(wù)器端Extender控件——在實(shí)際開(kāi)發(fā)中使用編寫(xiě)好的控件(注意,該文章基于CTP版本書(shū)寫(xiě),部分內(nèi)容已經(jīng)過(guò)時(shí))。
?
CTP版本的擴(kuò)展器控件使用方法
一般來(lái)講,我們可以采用如下方法使用CTP版本中的擴(kuò)展器控件:
在將要應(yīng)用擴(kuò)展器控件的頁(yè)面上要保證有一個(gè)ScriptManager控件,并且其EnableScriptComponents屬性值要設(shè)定為true(這也是其默認(rèn)值)。因?yàn)閿U(kuò)展器控件將生成Atlas的客戶端行為(Behavior),然后委托給這個(gè)行為去完成真正的客戶端擴(kuò)展工作,而行為的運(yùn)行則需要有完整的Atlas客戶端框架支持。 頁(yè)面源代碼中,在ScriptManager控件聲明的后面添加擴(kuò)展器控件的聲明。即添加類似<atlas:[擴(kuò)展器名稱]Extender>的標(biāo)簽,并為其指派一個(gè)ID,當(dāng)然還有必不可少的runat="server"。這個(gè)標(biāo)簽可以被認(rèn)為是該Atlas頁(yè)面中所有同樣類型的擴(kuò)展器控件的歸類。你同樣可以在該標(biāo)簽中指定擴(kuò)展器的某些屬性,和AutoCompleteExtender擴(kuò)展器的MinimumPrefixLength、ServiceMethod、ServicePath等屬性一樣。 在擴(kuò)展器控件的聲明標(biāo)簽內(nèi)添加擴(kuò)展其屬性聲明標(biāo)簽,即在<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽內(nèi)添加類似<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽。該擴(kuò)展器的擴(kuò)展目標(biāo)(TargetControlID屬性,這是每一種<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽都支持的。)以及其專有的屬性(例如<atlas:AutoCompleteProperties>的Enabled屬性)可以在該標(biāo)簽中設(shè)定。 對(duì)于<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽和<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽中暴露出的相同的屬性,我們可以任選一處進(jìn)行設(shè)定。但如果兩處都設(shè)定了的話,那么將取<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽中的設(shè)定值,也就是說(shuō)<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽中的設(shè)定將覆蓋<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽中的設(shè)定。合理選擇某個(gè)重復(fù)出現(xiàn)在<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽和<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽中屬性的設(shè)定位置將有利于在頁(yè)面中包含有多個(gè)同樣類型擴(kuò)展器控件時(shí)減少擴(kuò)展器聲明部分的代碼量。 一個(gè)<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽下可以定義多個(gè)<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽。換句話說(shuō),若要使用已經(jīng)在頁(yè)面中使用過(guò)的擴(kuò)展器控件,我們既可以重新添加一個(gè)<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽并在其中添加相應(yīng)的<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽,也可以在原有的<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽內(nèi)添加一個(gè)新的<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽。一般情況下,我們應(yīng)該盡力使用后一種方法,因?yàn)檫@樣可以讓代碼簡(jiǎn)潔易懂。然而,不是所有的擴(kuò)展器控件,也不是在每種情況下我們都可以使用這種方法的,某個(gè)擴(kuò)展器控件是否能夠完全支持這種只添加另一個(gè)額外<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽的方法來(lái)在頁(yè)面中添加多個(gè)擴(kuò)展器,將取決于控件設(shè)計(jì)時(shí)<atlas:[擴(kuò)展器名稱]Properties>標(biāo)簽中所暴露出的屬性能否完全覆蓋<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽中暴露的屬性。 一個(gè)現(xiàn)有的ASP.NET控件可以添加多個(gè)擴(kuò)展器控件,分別使用不同的<atlas:[擴(kuò)展器名稱]Extender>標(biāo)簽聲明。 ?
CTP到Beta中擴(kuò)展器控件使用方法的變化
Beta版本中,ASP.NET AJAX的擴(kuò)展器控件概念被大大簡(jiǎn)化,取消了CTP版本中的<atlas:[擴(kuò)展器名稱]Extender>和<atlas:[擴(kuò)展器名稱]Properties>這兩個(gè)標(biāo)簽,而是統(tǒng)一使用<asp:[擴(kuò)展器名稱]Extender>標(biāo)簽。所有的屬性也都在<asp:[擴(kuò)展器名稱]Extender>標(biāo)簽中設(shè)置。
?
Beta版本的擴(kuò)展器控件使用方法
一般來(lái)講,我們可以采用如下方法使用Beta版本中的擴(kuò)展器控件(同樣適用于ASP.NET AJAX Control Toolkit中的擴(kuò)展器控件):
在將要應(yīng)用擴(kuò)展器控件的頁(yè)面上要保證有一個(gè)ScriptManager控件。因?yàn)閿U(kuò)展器控件將生成ASP.NET AJAX的客戶端行為,然后委托給這個(gè)行為去完成真正的客戶端擴(kuò)展工作,而行為的運(yùn)行則需要有完整的ASP.NET AJAX客戶端框架支持。 頁(yè)面源代碼中,在ScriptManager控件聲明的后面添加擴(kuò)展器控件的聲明。即添加類似<asp:[擴(kuò)展器名稱]Extender>的標(biāo)簽,并為其指派一個(gè)ID,當(dāng)然還有必不可少的runat="server"。 該擴(kuò)展器的擴(kuò)展目標(biāo)控件(由TargetControlID屬性指定)是必不可少的,任何一種擴(kuò)展器控件都支持該屬性。我們應(yīng)該將其指向需要被“擴(kuò)展”的服務(wù)器端控件,例如上面的AutoCompleteExtender示例程序中就將該屬性指向了頁(yè)面中的一個(gè)TextBox。 設(shè)置該擴(kuò)展器控件專有的屬性,例如AutoCompleteExtender的ServicePath和ServiceMethod屬性等。 我們可以為某個(gè)現(xiàn)有的ASP.NET控件添加多個(gè)擴(kuò)展器控件,這些功能將疊加到一起,并應(yīng)用到目標(biāo)控件上。 ?
擴(kuò)展器控件與裝飾模式(Decorator Pattern)
ASP.NET AJAX中的擴(kuò)展器控件是裝飾模式的一次非常典型且完美的應(yīng)用。Design Pattern一書(shū)中提到,裝飾模式有如下的幾種使用情況:
在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。 處理那些可以撤消的職責(zé)。 當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。 對(duì)于這三種使用情況,ASP.NET AJAX中的擴(kuò)展器控件均有良好體現(xiàn)。我們就以應(yīng)用于ASP.NET中TextBox控件的AutoCompleteExtender擴(kuò)展器控件來(lái)舉例:
不是應(yīng)用程序中所有的TextBox都需要自動(dòng)完成功能的。一般來(lái)講,需要自動(dòng)完成功能的TextBox在整個(gè)應(yīng)用程序中所占的比例非常少。若使用繼承來(lái)實(shí)現(xiàn)該功能,則勢(shì)必導(dǎo)致自動(dòng)完成功能在大多數(shù)TextBox中都沒(méi)有使用。而且,這種繼承的實(shí)現(xiàn)方式也需要對(duì)現(xiàn)有的代碼進(jìn)行修改(將<asp:TextBox>標(biāo)簽修改為類似<asp:AutoCompleteTextBox>的標(biāo)簽)。既提高了對(duì)現(xiàn)有程序擴(kuò)展的難度,也增大了在修改過(guò)程中發(fā)生錯(cuò)誤的可能性。 對(duì)于程序中需要暫時(shí)控制自動(dòng)完成功能啟用與否的需求,我們只要簡(jiǎn)單地改變是否為其添加AutoCompleteExtender擴(kuò)展器控件既可。若采用繼承的方式在程序中動(dòng)態(tài)創(chuàng)建新的TextBox,則需要選擇不同的對(duì)象(TextBox或AutoCompleteTextBox)進(jìn)行創(chuàng)建,比較麻煩;而若采用應(yīng)用了裝飾模式的擴(kuò)展器控件方式,就可以首先總是創(chuàng)建同一類TextBox控件,然后根據(jù)是否需要自動(dòng)完成功能來(lái)決定是否創(chuàng)建AutoCompleteExtender。即使程序運(yùn)行中該TextBox不再需要自動(dòng)完成功能了,我們也無(wú)需對(duì)TextBox做任何的修改,只要移除其附加的AutoCompleteExtender即可。 對(duì)于ASP.NET的TextBox控件來(lái)說(shuō),我們既可以使用AutoCompleteExtender讓其擁有自動(dòng)完成的功能,也可以使用ASP.NET AJAX Control Toolkit中的FilteredTextBox擴(kuò)展器讓用戶只能在其中以一種指定模式輸入文本。這樣,若使用繼承的方式來(lái)實(shí)現(xiàn)這兩種擴(kuò)充,我們的系統(tǒng)中則必須維護(hù)四種對(duì)象:TextBox、AutoCompleteTextBox、FilteredTextBox以及FilteredAutoCompleteTextBox。如果某一天我們還要給TextBox添加水印的功能(即ASP.NET AJAX Control Toolkit中的TextBoxWatermark擴(kuò)展器所實(shí)現(xiàn)的功能),則需要維護(hù)的TextBox的種類則將增加為8種!長(zhǎng)此以往,這種“類爆炸”的結(jié)果將讓系統(tǒng)非常難以擴(kuò)展或維護(hù)。若采用應(yīng)用了裝飾模式的擴(kuò)展器控件的方式,則只要維護(hù)這幾個(gè)擴(kuò)展器,并在需要時(shí)從中選擇并添加到某個(gè)TextBox上。 ?
寫(xiě)作感想
結(jié)構(gòu)化、有組織的論述問(wèn)題 文章要符合讀者的閱讀習(xí)慣(重復(fù)好多遍了) 我似乎變得越來(lái)越能寫(xiě)了,可是語(yǔ)言越來(lái)越蒼白 擁抱變化有點(diǎn)累 (還沒(méi)想好……) (PS:本文部分內(nèi)容選自我的Atlas著作——《ASP.NET AJAX程序設(shè)計(jì)——第I卷:服務(wù)器端ASP.NET 2.0 AJAX Extensions與ASP.NET AJAX Control Toolkit》,將于明年一月出版,希望大家支持。)
總結(jié)
以上是生活随笔 為你收集整理的拥抱变化——从Atlas到ASP.NET AJAX(4):大大简化的了的Extender扩展器控件 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。