說了半天看來還是沒說明白,估計是長時間不寫博語言群組織能力退化了。其實要說的很簡單,用了那麼多模板引擎(為了趕項目自己還寫過一個)結果到頭來我發現自己在做一件很蠢的事情。讓模板引擎支援判斷,迴圈,分支,不同的強化出各種不同的標籤,標籤越來越像asp.net的控制項標籤,API越來越複雜。也許最後一回頭髮現我們實現了一個asp.net老早就已經存在的東西。那為什麼我們不現在直接就拿來用了?
以下我將分幾個部分來說明我的觀點,再次重申,我不是說不用模板引擎,我的觀點是aspx檔案本身就是最好的模板引擎了,至於如何用,我後面會給出一個我自己用的一種方式,當然你也可以總結出你自己的:
一、模板引擎的軟肋
很多做PHP的同學對模板引擎很熟悉,比如Smarty,說出這個主要是顯得我還是懂點不是啥也沒聽說過的愣頭青。模板引擎的優點當然不需要我多說,如果沒優點那根本就沒有存在的價值。首先第一個要面臨的問題就是學習的成本。老實說,就現在的模板引擎的文法而言,而什麼越來越向程式設計語言靠攏也就是為了降低學習的成本。下面是一段Smarty的模板代碼:{* Monte Ohrt March 4, 2002 *}
{* $cols is the number of columns you want *}
<TABLE border=1>
<TR>
{section name=numloop loop=$data}
<TD>{$data[numloop]}</TD>
{* see if we should go to the next row *}
{if not ($smarty.section.numloop.rownum mod $cols)}
{if not $smarty.section.numloop.last}
</TR><TR>
{/if}
{/if}
{if $smarty.section.numloop.last}
{* pad the cells not yet created *}
{math equation = "n - a % n" n=$cols a=$data|@count assign="cells"}
{if $cells ne $cols}
{section name=pad loop=$cells}
<TD> </TD>
{/section}
{/if}
</TR>
{/if}
{/section}
</TABLE>
當然如果習慣了的同學會覺得也沒啥啊,不過對於完全沒接觸的人來說,或者沒空去學習的人(比如說我)來說,這段代碼不仔細研究就跟天書一樣。對於美工而言,更加是天書一般的存在,怪不得國內一個Smarty教程網站的站長說:趕緊來學吧,這玩意兒難學,工資高。對於IT來說越難學的工資越高,彷彿為了錢確實要跟自己過不去。換個其他的模板引擎也差不多,我就不一一列舉代碼了。除了模板本身的“範本語言”需要學習外,還有模板引擎本身的API需要學習。那麼對於程式員和美工來說這都是雙重負擔。
其二就是編譯支援和工具支援,Smarty還算不錯,Dreamweaver裡頭有個外掛程式,不過對於被智能感知菜單和編譯期檢測慣壞的.NETer 和Javaer來說還是顯得太稚嫩了(沒有智能感知菜單就請你殺了我吧)。看著文檔寫代碼,然後run一下看看結果貌似是上個世紀的工作方式。或許有一天各類開源愛好者可以搞出各類外掛程式來解決這個問題,不過誰有這個時間等待,誰有這個時間去一一試用那個外掛程式好呢?
二、模板引擎使用的誤區
現在大多數模板引擎所乾的事情就是把資料和模板合攏一堆產生結果html(xml或者其他什麼的暫時不考慮)。那麼其中一個使用的誤區就來了,把模板引擎誤認為是換膚引擎,比如最典型的想法是:
#1樓 iiduce@163.com 2008-07-08 10:09 小狼壯壯
使用aspx做模板,怎麼實現同一cs代碼,多套模板共存,達到迅速更換模板的目的呢。
-------------------------------------------------------------------------------華麗的分割線--------------------------------------------------
模板引擎最常用的地方就是CMS系統了,CMS系統一般都會產生靜態頁面來提高效率。還有一個就是很多MVC架構會使用到模板引擎來實現View,不過如果如果頁面很複雜,涉及大量的對象賦值以及迴圈和控制的話,可能會因為大量的反射而導致效率的瓶頸(關於這點沒測試過,有興趣的可以測測)。關於這兩點基本都是直接產生最終結果。換膚等功能性的東西個人覺得不應該作為模板引擎的主要設計目的。
三、使用ASPX頁面作為模板引擎的可行性和優勢所在
可行性就不說了,當然是可行的,而且現在ASP.NET MVC已經在使用aspx頁面做View層了,下面來說優勢
對編程人員來說根本就不用學了,本來就會的,學習效率當然最高。
Dreamweaver和VS.NET都支援,而且智能感知菜單,編譯時間檢測都存在。這點Very Nice
這點有同學說控制項不方便,那麼其實不用控制項,在頁面上直接<%
if(Helper.IsLogin()){
User u=Helper.GetLoginedUser();
%>
你的姓名是:<%=u.Name%>
<%}%>
是不是還是一樣的,何必非要把自己套死呢?
有人說是不是要在XX層引入System.Web,其實這個問題就有點搞笑了,MVC和分層完全是兩碼事了。就算是按分層的理論來說在邏輯層引入System.Web也不是什麼問題,如果要用StringTemlate做模板引擎,那麼肯定也要引入StringTemplate的Dll,那麼用aspx頁面做模板引擎的話引入System.Web不是也在情理之中嗎?
最後來說說我是怎麼用的
調用模板還是通過Server.Execute,主要是為瞭解決調用檔案的問題,我沒有用load ascx檔案的方式,而是定義了一個預留位置,執行了這個頁面後搜尋一下有幾個預留位置,然後根據預留位置去調用其他的模板,最後把執行後的結果替換過來。