使用aspx頁面作爲模板引擎的一種實現

使用aspx頁面作爲模板引擎的一種實現 
2008-07-08  
     什麼是模板引擎?說白了就是能夠自動替換佔位符的替換引擎。原理上也就是兩個步驟,找到-》替換。但是替換不是簡單的替換,包括: 

        簡單變量替換(); 
        複雜變量替換(); 
        對象變量替換(); 
        鍵值類型替換(); 
        自定義集合替換(); 
        同時顯示多個變量(); 
        模板調用(); 
        給調用模板傳參數(); 
        值模板(); 
        簡單循環(); 
        交差循環顯示(); 
        通過模板交差循環(); 
        條件判斷(); 
        從文件中創建模板(); 

        常用的模板引擎,StringTemplate和velocity差不多都是按照這種模式來設計的。但是這樣子真的就是我們需要的嗎?我們拿一段典型的StringTemplate的模板代碼來看看: 

        首先是在模板文件中: 

        姓名:$User.Name$ 年齡:$User.Value$ 

        然後是在代碼裏:          User us = new User(); 
        us.Name = "xxsssx"; 
        us.Value ="80"; 
        StringTemplate st = new StringTemplate("$User.Name$,$User.Value$"); 
        st.SetAttribute("User", us); 
        Console.WriteLine(st.ToString());  


[NextPage] 

        那麼我們來和ASP.NET本身的代碼做一個比較 

        aspx頁面          <asp:Label id="Name" runat="Server" /><asp:Label id="Mail" runat="Server" /> 
        aspx.cs文件 
        User us = new User(); 
        us.Name = "xxsssx"; 
        us.Value ="80"; 
        Name.Text=us.Name; 
        Mail.Text=us.Value  


        就我個人來看,模板引擎是需要的。視圖和控制的分離是必要的,但是我們要分清楚什麼是視圖,什麼是控制。是不是視圖就不能包含代碼和邏輯?肯定答案是否定的,因爲就算用了StringTemplate,你還是需要給它填充數據,而給它填充數據的代碼仍然是屬於視圖而不是控制或者有人乾脆就當作了模型。那麼既然這樣,爲什麼我們就不能用aspx頁面本身來作爲模板呢?它可以判斷,可以循環,可以分支,可以使用現成的控件。比如          <% 
        if(Helper.IsLogin()){ 
        User u=Helper.GetLoginedUser(); 
        %> 
        你的姓名是:<%=u.Name%> 
        <%}%>  


        我們把這種方法和StringTemplate的方法來比較一下。 

                                    aspx模板    StringTemplate 
        asp.net控件         支持         不支持 
        複雜顯示邏輯         支持         支持(未經測試所有可能性) 
        編輯器支持            支持         不支持 
        編譯檢測               支持         不支持 

        現在可能有個疑問了,aspx的頁面怎麼作爲模板來被調用呢?以訪問就直接看到了沒辦法生成靜態頁面啊? 

        其實解決的方法很簡單,只需要Server.Execute()就可以將執行的aspx頁面運行的結果以一個TextWriter返回。這樣子要怎麼處理還不是看我們怎麼高興啦。哈哈 

        記得之前有人提過類似方法,不過有人可能會質疑:那不是還有美工也會asp.net?其實回過頭一想,如果你告訴美工<%=u.Name%>就是代表用戶的姓名,那麼也不會需要美工學習全套的asp.net,而其實就美工來說,如果學習簡單實用asp.net都有困難,那麼學習StringTemplate的全套模板語法和靈活掌握使用方法可能更加讓人鬱悶。如果這些工作都給程序員來完成的話,那麼已經是程序員熟練掌握的c#語法是不是更加的平易近人呢?況且還可以智能感知菜單和編譯檢測支持。所以我覺得在大多數情況下這種方法是比較爽的一種方式。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章