Custom Control

這個控制項輸出的目標HTML非常簡潔。 trol了。 是控制項輸出HTML的過程。

ASP.NET第一次使開發控制項成為每個程式設計師都可以做到的事情。開發一個好用的並且功能封裝得很好的控制項不再是只有前大的團隊才可以做的事情。儘管這樣,一些商業化的公司發布的產品還是功能強大得嚇人, 但是價格也夠嚇人的。做為個人或者小型的團隊,能夠發布一些實用的,小型的,簡單的控制項還是挺讓人興奮的。以下僅談以下作者對Custom Control設計上的認識和一些套用經驗。

什麼是Custom Control?
我常常把Custom Control和JSP的TAGLIB相提並論。其實在我看來二者有很多相似之處-設計思想上的類似。我是這樣理解Custom Control的:

1. 以dll形式發布,可直接使用。
2. 在HTML中做為特殊的伺服器端標記出現
3. 可通過編程設定其狀態
4. 擁有POST數據處理能力
5 可引發後端事件
5. 分為可視化和非可視化 其中可視化輸出目標HTML, 非可視化僅完成某些實用功能。
6. 可通過HTML ATTRIBUTE或者編程設定其特性

(本文偏向於介紹可視化控制項,特別是實用型小控制項)

以上第4條特別重要,因為既然是做為伺服器端的標記,就必須在數據回發的時候可以用代碼捕捉到該對象的狀態變化或者活動。

設計Custom Control的目的是簡化編碼的工作量。注意,這裡提供的便利不僅僅針對於眼前的項目,也許對世界上所有程式設計師有會帶來遍歷。與ASCX不同的是,Custom Control是跨工程和語言使用的。

我以前設計過一個小型的和比較簡單的DatePicker Custom Control. 可以在輸入日期類型的數據的時候彈出一個小型的漂亮的日曆。用滑鼠選取一個日期之後可以自動將日期按照格式寫到網頁上的控制項中。避免了人工輸入的格式校驗等麻煩事。這個控制項輸出的目標HTML非常簡潔。甚至僅僅輸出了一個HTML記號。實際上我把所有的工作都交給客戶端瀏覽器處理的。彈出日曆這個過程用到的腳本被我封裝到了一個htc檔案中,還有必須的一些圖片,數據等等全部在客戶端。這裡的客戶端容易產生誤解。是針對VB代碼而言的客戶端。其實腳本資源和其他靜態資源都放置在遠端伺服器上,只是設法在客戶端調用。
有的朋友可能會問為什麼要這樣做。

第一。不希望控制項產生的HTML污染了用戶的頁面。有的開發人員對代碼的整潔乾淨與否有著特別敏感的情緒。特別討厭一些設計比較差的控制項產生的大段的,雜亂的腳本。如果我們開發HTML, 我們絕對不會寫這么亂,而是將腳本與HTML分開。另外,減少輸出的HTML同時也可以在一定程度上提高性能。
第二。將腳本邏輯與VB邏輯隔離開,隔離二者便於維護各自功能。有時候(大部分機會)我們只需要更改支持的腳本或者HTC,而不需要重新編譯VB.
第三。當頁面上出現多個相同控制項時,優勢更明顯了。你一定不難想想頁面上有一堆一摸一樣的腳本會是什麼樣的場面。

舉一個最簡單的例子來說。你的工程里需要一組按鈕。(很少有工程不需要按鈕)。但是你的品味決定了你絕對不會將就HTML預設的那個灰灰的按鈕,樣子難看,缺乏創意。你可以很方便得使用CSS來格式化一下你所有的按鈕。但是你還是不滿意。你想要的按鈕要會隨著滑鼠靠近發生變化來取悅你的用戶。比如滑鼠靠近的時候變亮。滑鼠按下去變暗。這個也可以通過給按鈕設定DHTML Behavior實現。這個時候你的BOSS提出來。這樣的按鈕好。但是應該在這個模組變紅色系列,在另一個模組變藍色系列。你慌了。這個時候, 你就需要設計Button Custom Control了。除非你不覺得給控制項設定一系列CLASS麻煩。而且開發好了之後,你可以拿出來賣。相信會有不少BOSS感興趣。

讓按鈕隨滑鼠變色不難辦到。只要你需要,我可以給你免費提供HTC源碼。只要給按鈕設定Style=“Behavior:url(...htc)“ 就可以了。現在想一想我們要設計的控制項應該是什麼樣子。就像上面列出的:

1 編譯成一個DLL
2 在ASP.NET頁上以自定義的標記出現
3 可以通過HTML Attribute設定如何回響滑鼠動作或者滑鼠靠近了究竟變什麼顏色。
4 輸出到HTML中必須可以找到所需要的腳本和其他資源
5 必須能像後端引發事件。 即必須向普通按鈕一樣可以引發Click事件。不能光好看。

到這裡, 你也許已經知道要完成什麼工作。必須創造一個類,派生自System.Web.UI.WebControls.WebControl。 必須重寫Render方法。 Render是最關鍵的方法 。是控制項輸出HTML的過程。在寫這個方法之前。 你最好頭腦中有一個基本的想法。控制項生成的HTML是個什麼樣,如何在前台工作。通常有HTC的支持, 你需要傳送到客戶端的HTML應該不會很多。

公開的特性很重要。這關係到你的控制項會有多少人喜歡,或者會賣多少錢。你至少要讓你的客戶程式設計師們可以控制按鈕變色的方式。或者滑鼠靠近的時候是變色,還是鼓起來,還是發出聲音,還是跑到另一個地方?你可以把這些屬性保存在私有成員里。在Render方法裡一併輸出給客戶端,例如Button類有一個特性是ColorScheme。這個值確定了一系列顏色組,分別是按鈕在mouseover, MouseDown, MouseUp, mouseout的時候的顏色。你的VB程式只需要將這個特性照原樣輸出到客戶端。然後跟你的開發HTC或者腳本的夥伴說:去實現吧。另一些特性就需要你來處理。總之這個平衡要視乎成員的意志堅強與否。總之要讓邏輯上靈活性更高。

另外你必須告訴客戶端那個可憐的HTML如何尋找自己的資源。一般我會給Button加上一個特性。ResourcePath,這是一個字元串,表示資源相對於當前頁的相對路徑。然後把寫好的腳本,圖片和其他靜態資源打包給用戶。告訴他們,把這些東西解開拷貝到伺服器WEB某個目錄下,然後把這個路徑設定到控制項上。

輸出到客戶端的HTML大體上是這個樣子:
<TimeLine:Button ColorScheme=“xp“/>

(以上是HTML的Custom Tag,需要將htc提前引入到頁面中。)

另外你必須想辦法讓控制項可以向後端引發事件。我一般是給控制項附加一個看不見的FORM域。讓傳送到後端的數據可以被這個方法自己處理。這個問題再展開談的話篇幅會變得很長。這篇文章多少涉及了一點:http://www.cnblogs.com/jayxu/archive/2004/03/26/4252.aspx 注意,在弄懂這個問題前, 先不要嘗試動手開發。因為這樣做出來的東西肯定不能用。MSDN文檔很詳細的解釋了這個問題。請按索引“引發伺服器事件”查找。

其他想法。當你的控制項開發完畢。(熟練的朋友可能用不了一天)。你可以只需寫一個類似<asp:Button />的標記就可以使用你的控制項了。

進一步擴充。你可以為你的Button增加AutoPostBack特性。如果設定為false,那么即使單擊按鈕也不會將頁面發回,這個時候你有可以給Button加上OnClick屬性(不同於事件Click),設定客戶端Click時處理這個動作的腳本過程。

Button有點簡單。但是可以做為入門的範例研究。作者有不少類似作品。只要有時間,還是很樂意再寫文章分析的。 作者偏向於套用,基本功不強。歡迎廣泛批評。

相關詞條

相關搜尋

熱門詞條

聯絡我們