作者: Tomex Ou
版本歷史:
2008/06/21 AM 11:19:59 心得初稿。
背景介紹
網頁程式設計說簡單亦困難,一個有經驗的網頁設計師,必須具備HTML/Web環境平台/程式語言/Javascript/視覺美工等各技能的養成,雖然網頁呈現的視覺設計足以掩蓋後端程式設計的價值,卻掩蓋不了它的架構光輝。我從ASP時代走入PHP,研究所時為了打破課堂上以Java為尊卻生產力薄弱的空談,又學了JSP/JavaBean,最後ASP.NET出現趕緊回來全力主攻。各種網頁程式語言或有不同,但原理架構大凡類似,從腳本HTML混淆的Scriptlet走至HTML/程式碼分離的CodeBehind,對於頁面精簡有感動到,但實務上若完全使用CodeBehind的分離設計方式,每次需要調整又得重新編釋專案再佈署,最糟糕的是老專案早就忘光了,80%的時間都花在回想架構。
更慘的是,ASP.NET頁面設計若以Server Control控制項來表達視覺設計師的純HTML,網頁排版呈現上老是走樣。客戶偶爾來電要修改一個小東西,偏偏這東西放在CodeBehind的cs檔中,又得重新編譯。為了解決這樣的困境,程式設計階段必須把可能更動的客製化部分開放出來,讓User來調整,這對於日後的維護工作肯定會非常、十分有幫助,大家賓主盡歡。
控件選擇
至ASP.NET 3.5還不算是很完整的MVC(Model-View-Controller),導入LINQ技術後的下一版本才是完整的MVC呈現。但不管如何,我們必須有自己的資料元件/函式庫來加快資料的擷取整理,程式碼依然要選擇CodeBehind的方式以Method呼叫,最後填充至網頁上的控制項。為了抓住呈現上不走樣且兼顧維護/客製異動的重點,最好仍是使用使用Repeater或任何ItemTemplate來直接貼入美化HTML碼,因為它們能夠完整僅輸出精簡的HTML,減少排版上的走樣及費工。
曾經,各式各樣的ASP.NET 2.0控制項中,我選擇GridView的ItemTemplate為萬用的法器,因為它能提供分頁及後端項目呈現上的程式邏輯控制。但GridView並非萬能,水平式的項目呈現得靠DataList的特性,新的DataPager控項也無法與GridView結合的限制,因此從ASP.NET 3.5後,我選用DataView控件來當武器,具有分頁或水平延展就用它,其他的就全用Repeater控制者,一個網站設計下來,兩者使用出現的機率是20%:80%。
Scriptlet Pattern
資料控制項的程式邏輯可以寫在*.cs後,也可以寫在前端的*.aspx裏,為了客製化修改,我儘量都寫在前端網頁裏,只要資料的讀取載入才寫在後端*.cs中。為了能調整後端函式的變化,也把調整參數拉出來至前端*.aspx,其設計模型為下圖:

依項目編號說明如下:
1. 使用Repeater控件來呈現項目呈現,因為它簡單且效能高。
2. 變動資料用後期繫結(Late Binding)方式,雖然比寫在*.cs的早期繫結(Early Binding)效能差,但取其簡易易修改之優點。
3. 資料呈現的項目、排序及筆數常常會變動,因此使用隱藏式的Literal來維護,不用HiddenField的原因在於它會曝露在網頁源碼裏。
4. 比較複雜的輸出,用一個Method來調整,發現這種後期繫結資料無法直接給區域變數,但透過Method倒是可行。
5. 涉及html輸出的特殊格式,寫在前端函式中,方便變化及修改。
CodeBehind
後端CodeBehind裏用單一函式作資料DataBind():
除了很特殊、複雜的需求外,儘量不在Repeater.ItemDataBound()中作處理,因為異動需要重新編譯。
文章結論
若你仔細端詳上述的Pattern方式,你將能體會它是一個具備User客製化調整的優良設計方式,同時兼顧User與Programmer的角色定位。雖然一個網站的報價都是看視覺設計及功能特色,但背後的編程架構若能採用正確的方式,都是對曾經付出的生命歷程所作出的一項正面肯定。喜歡亂寫程式或便宜行事者,日後作品出現問題或被資歷淺的同事觀摩時,你的評價肯定會一直滑落而不知。