擁抱變化——從Atlas到ASP.NET AJAX(4):大大簡化的了的Extender擴充器控制項

來源:互聯網
上載者:User

閱讀本文之前,您需要安裝完成Microsoft ASP.NET AJAX v1.0 Beta(詳見擁抱變化——從Atlas到ASP.NET AJAX(1):下載安裝總覽)。安裝完成之後,Visual Studio中建立Web Site的時候會多出一個模版:ASP.NET AJAX Enabled Web Site。接下來的內容均將基於建立的ASP.NET AJAX Enabled Web Site。

 

摘要

在ASP.NET AJAX中,Extender Control(擴充器控制項)同樣很重要。如果說UpdatePanel只是將Ajax的核心概念和基本特性——局部更新和非同步回送引入了ASP.NET的話,那麼擴充器控制項則在這個基本特性上邁出了新的一步——為頁面添加豐富的用戶端功能,讓使用者一眼就能夠看出來:噢,這個網站真的太“Ajax”了!

本文將分析相對於從Atlas到ASP.NET AJAX中擴充器控制項使用方法的變化。

 

擴充器控制項介紹

ASP.NET AJAX提供了兩種內建的擴充器控制項:DragOverlayExtender和AutoCompleteExtender,前者讓使用者可以將頁面中的某個部分在其中任意拖動並排布,而後者可以為某個TextBox添加自動完成的功能。這樣,該TextBox將擁有類似瀏覽器地址欄的行為,使用者輸入一段文字後會自動彈出與之匹配的提示選項。關於CTP版本的AutoCompleteExtender使用方法,請參考使用ASP.NET Atlas AutoComplete Behavior或AutoComplete Extender實現自動完成功能(上)以及使用ASP.NET Atlas AutoComplete Behavior或AutoComplete Extender實現自動完成功能(下)。

擴充器控制項的實現原理也不複雜:ASP.NET AJAX將在產生HTML時將ASP.NET頁面中定義的擴充器控制項轉化為ASP.NET AJAX用戶端行為(Behavior)的聲明,並添加到頁面中,除此之外的所有實現均由ASP.NET AJAX的用戶端運行時處理。當頁面到達用戶端之後,用戶端的ASP.NET AJAX架構將在用戶端運行該行為。關於ASP.NET AJAX用戶端行為,請參考在ASP.NET Atlas中建立自訂的Behavior(注意,該文章基於CTP版本書寫,部分內容已經過時)。

另一個微軟公司和社區共同開發的免費開源的第三方控制項包——ASP.NET AJAX Control Toolkit則提供了更多、甚至可謂包羅永珍的擴充器控制項,幾乎覆蓋了常用的各種富用戶端功能,並且還在迅速增加中。而這些控制項使用起來又和ASP.NET AJAX內建的擴充器控制項完全一致,讓開發人員倍感親切。ASP.NET AJAX Control Toolkit中提供的這些擴充器控制項將在本卷第7、8、9、10章中詳細介紹。ASP.NET AJAX Control Toolkit還提供了擴充器控制項的基礎開發設施(控制項基類等)以及Visual Studio中的項目模版等。藉助於這些便利的設施,我們也可以容易地進行自訂控制項的開發。關於伺服器端擴充器控制項的開發,請參考開發ASP.NET Atlas伺服器端Extender控制項——基本概念以及預先需求、開發ASP.NET Atlas伺服器端Extender控制項——編寫用戶端Behavior、開發ASP.NET Atlas伺服器端Extender控制項——編寫伺服器端Extender & Dflying近期動向以及開發ASP.NET Atlas伺服器端Extender控制項——在實際開發中使用編寫好的控制項(注意,該文章基於CTP版本書寫,部分內容已經過時)。

 

CTP版本的擴充器控制項使用方法

一般來講,我們可以採用如下方法使用CTP版本中的擴充器控制項:

  1. 在將要應用擴充器控制項的頁面上要保證有一個ScriptManager控制項,並且其EnableScriptComponents屬性值要設定為true(這也是其預設值)。因為擴充器控制項將產生Atlas的用戶端行為(Behavior),然後委託給這個行為去完成真正的用戶端擴充功能工作,而行為的運行則需要有完整的Atlas用戶端架構支援。
  2. 頁面原始碼中,在ScriptManager控制項聲明的後面添加擴充器控制項的聲明。即添加類似<atlas:[擴充器名稱]Extender>的標籤,並為其指派一個ID,當然還有必不可少的runat="server"。這個標籤可以被認為是該Atlas頁面中所有同樣類型的擴充器控制項的歸類。你同樣可以在該標籤中指定擴充器的某些屬性,和AutoCompleteExtender擴充器的MinimumPrefixLength、ServiceMethod、ServicePath等屬性一樣。
  3. 在擴充器控制項的聲明標籤內添加擴充其屬性聲明標籤,即在<atlas:[擴充器名稱]Extender>標籤內添加類似<atlas:[擴充器名稱]Properties>標籤。該擴充器的擴充目標(TargetControlID屬性,這是每一種<atlas:[擴充器名稱]Properties>標籤都支援的。)以及其專有的屬性(例如<atlas:AutoCompleteProperties>的Enabled屬性)可以在該標籤中設定。
  4. 對於<atlas:[擴充器名稱]Properties>標籤和<atlas:[擴充器名稱]Extender>標籤中暴露出的相同的屬性,我們可以任選一處進行設定。但如果兩處都設定了的話,那麼將取<atlas:[擴充器名稱]Properties>標籤中的設定值,也就是說<atlas:[擴充器名稱]Properties>標籤中的設定將覆蓋<atlas:[擴充器名稱]Extender>標籤中的設定。合理選擇某個重複出現在<atlas:[擴充器名稱]Properties>標籤和<atlas:[擴充器名稱]Extender>標籤中屬性的設定位置將有利於在頁面中包含有多個同樣類型擴充器控制項時減少擴充器聲明部分的代碼量。
  5. 一個<atlas:[擴充器名稱]Extender>標籤下可以定義多個<atlas:[擴充器名稱]Properties>標籤。換句話說,若要使用已經在頁面中使用過的擴充器控制項,我們既可以重新添加一個<atlas:[擴充器名稱]Extender>標籤並在其中添加相應的<atlas:[擴充器名稱]Properties>標籤,也可以在原有的<atlas:[擴充器名稱]Extender>標籤內添加一個新的<atlas:[擴充器名稱]Properties>標籤。一般情況下,我們應該儘力使用後一種方法,因為這樣可以讓代碼簡潔易懂。然而,不是所有的擴充器控制項,也不是在每種情況下我們都可以使用這種方法的,某個擴充器控制項是否能夠完全支援這種只添加另一個額外<atlas:[擴充器名稱]Properties>標籤的方法來在頁面中添加多個擴充器,將取決於控制項設計時<atlas:[擴充器名稱]Properties>標籤中所暴露出的屬效能否完全覆蓋<atlas:[擴充器名稱]Extender>標籤中暴露的屬性。
  6. 一個現有的ASP.NET控制項可以添加多個擴充器控制項,分別使用不同的<atlas:[擴充器名稱]Extender>標籤聲明。

 

CTP到Beta中擴充器控制項使用方法的變化

Beta版本中,ASP.NET AJAX的擴充器控制項概念被大大簡化,取消了CTP版本中的<atlas:[擴充器名稱]Extender>和<atlas:[擴充器名稱]Properties>這兩個標籤,而是統一使用<asp:[擴充器名稱]Extender>標籤。所有的屬性也都在<asp:[擴充器名稱]Extender>標籤中設定。

 

Beta版本的擴充器控制項使用方法

一般來講,我們可以採用如下方法使用Beta版本中的擴充器控制項(同樣適用於ASP.NET AJAX Control Toolkit中的擴充器控制項):

  1. 在將要應用擴充器控制項的頁面上要保證有一個ScriptManager控制項。因為擴充器控制項將產生ASP.NET AJAX的用戶端行為,然後委託給這個行為去完成真正的用戶端擴充功能工作,而行為的運行則需要有完整的ASP.NET AJAX用戶端架構支援。
  2. 頁面原始碼中,在ScriptManager控制項聲明的後面添加擴充器控制項的聲明。即添加類似<asp:[擴充器名稱]Extender>的標籤,並為其指派一個ID,當然還有必不可少的runat="server"。
  3. 該擴充器的擴充目標控制項(由TargetControlID屬性指定)是必不可少的,任何一種擴充器控制項都支援該屬性。我們應該將其指向需要被“擴充”的伺服器端控制項,例如上面的AutoCompleteExtender樣本程式中就將該屬性指向了頁面中的一個TextBox。
  4. 設定該擴充器控制項專有的屬性,例如AutoCompleteExtender的ServicePath和ServiceMethod屬性等。
  5. 我們可以為某個現有的ASP.NET控制項添加多個擴充器控制項,這些功能將疊加到一起,並應用到目標控制項上。

 

擴充器控制項與裝飾模式(Decorator Pattern)

ASP.NET AJAX中的擴充器控制項是裝飾模式的一次非常典型且完美的應用。Design Pattern一書中提到,裝飾模式有如下的幾種使用方式:

  1. 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
  2. 處理那些可以撤消的職責。
  3. 當不能採用產生子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充,為支援每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用於產生子類。

對於這三種使用方式,ASP.NET AJAX中的擴充器控制項均有良好體現。我們就以應用於ASP.NET中TextBox控制項的AutoCompleteExtender擴充器控制項來舉例:

  1. 不是應用程式中所有的TextBox都需要自動完成功能的。一般來講,需要自動完成功能的TextBox在整個應用程式中所佔的比例非常少。若使用繼承來實現該功能,則勢必導致自動完成功能在大多數TextBox中都沒有使用。而且,這種繼承的實現方式也需要對現有的代碼進行修改(將<asp:TextBox>標籤修改為類似<asp:AutoCompleteTextBox>的標籤)。既提高了對現有程式擴充的難度,也增大了在修改過程中發生錯誤的可能性。
  2. 對於程式中需要暫時控制自動完成功能啟用與否的需求,我們只要簡單地改變是否為其添加AutoCompleteExtender擴充器控制項既可。若採用繼承的方式在程式中動態建立新的TextBox,則需要選擇不同的對象(TextBox或AutoCompleteTextBox)進行建立,比較麻煩;而若採用應用了裝飾模式的擴充器控制項方式,就可以首先總是建立同一類TextBox控制項,然後根據是否需要自動完成功能來決定是否建立AutoCompleteExtender。即使程式運行中該TextBox不再需要自動完成功能了,我們也無需對TextBox做任何的修改,只要移除其附加的AutoCompleteExtender即可。
  3. 對於ASP.NET的TextBox控制項來說,我們既可以使用AutoCompleteExtender讓其擁有自動完成的功能,也可以使用ASP.NET AJAX Control Toolkit中的FilteredTextBox擴充器讓使用者只能在其中以一種指定模式輸入文本。這樣,若使用繼承的方式來實現這兩種擴充,我們的系統中則必須維護四種對象:TextBox、AutoCompleteTextBox、FilteredTextBox以及FilteredAutoCompleteTextBox。如果某一天我們還要給TextBox添加浮水印的功能(即ASP.NET AJAX Control Toolkit中的TextBoxWatermark擴充器所實現的功能),則需要維護的TextBox的種類則將增加為8種!長此以往,這種“類爆炸”的結果將讓系統非常難以擴充或維護。若採用應用了裝飾模式的擴充器控制項的方式,則只要維護這幾個擴充器,並在需要時從中選擇並添加到某個TextBox上。

 

寫作感想

  1. 結構化、有組織的論述問題
  2. 文章要符合讀者的閱讀習慣(重複好多遍了)
  3. 我似乎變得越來越能寫了,可是語言越來越蒼白
  4. 擁抱變化有點累
  5. (還沒想好……)

(PS:本文部分內容選自我的Atlas著作——《ASP.NET AJAX程式設計——第I卷:伺服器端ASP.NET 2.0 AJAX Extensions與ASP.NET AJAX Control Toolkit》,將於明年一月出版,希望大家支援。)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.