其實這個標題命名的有點大,但是主題明確:就是使用StringTemplate模板引擎,採用HTML頁面和ASP.NET頁面(可以使用ASP.NET控制項)作為模板,實現*****(這個實現什麼就不用說了吧,這裡省略200字。)
1. 模板技術的原理:
就是能夠自動替換預留位置的替換引擎。原理上也就是兩個步驟,找到—>替換。但是替換不是簡單的替換,包括:
簡單變數替換();
複雜變數替換();
物件變數替換();
索引值類型替換();
自訂集合替換();
同時顯示多個變數();
模板調用();
給調用模板傳參數();
值模板();
簡單迴圈();
交差迴圈顯示();
通過模板交差迴圈();
條件判斷();
從檔案中建立模板();
StringTemplate基本上就是按照這種模式來設計的。
2. 技術實現
2.1 首先是在HTML模板檔案中:
姓名:$User.Name$ 年齡:$User.Value$
在對應的cs字碼頁面中:
User us = new User();<br />us.Name = "xxsssx";<br />us.Value ="80";<br />StringTemplate st = new StringTemplate("$User.Name$,$User.Value$");<br />st.SetAttribute("User", us);<br />Console.WriteLine(st.ToString());
2.2 與ASP.NET頁面比較
aspx頁面:
<asp:Label id="Name" runat="Server" /><asp:Label id="Mail" runat="Server" />
aspx.cs檔案:
User us = new User();<br />us.Name = "xxsssx";<br />us.Value ="80";<br />Name.Text=us.Name;<br />Mail.Text=us.Value
在StringTemplate中,我們知道StringTemplate可以完成很多工作,實際的功能已經很強大了,包括比如條件判斷、迴圈遍曆...我們只需要在後端字碼頁面進行資料填充就可以了,但是對於複雜的商務邏輯呢?比如可以判斷,可以迴圈,可以分支,可以使用現成的控制項,對於複雜的功能,我們是不是很期望能夠使用到ASP.NET本身內建的強大的控制項呢?ok,恭喜你,你的想法將會得到實現!!哈哈!~
在開始之前,我們介紹一下使用ASP.NET模板與StringTemplate方法的對比:
aspx模板 StringTemplate
asp.net控制項 支援 不支援
複雜顯示邏輯 支援 支援(未經測試所有可能性)
編輯器支援 支援 不支援
編譯檢測 支援 不支援
OMG!!用ASP.NET作為模板的話功能真是好強大啊!!但是。。。。關鍵的問題是。。怎麼利用aspx的頁面作為模板來被調用呢??
其實解決的方法很簡單,只需要Server.Execute()就可以將執行的aspx頁面啟動並執行結果以一個TextWriter返回。
Server 是 ASP 中的一個內建對象,它有一個方法為 Execute,用法是:
Server.Execute(path)
微軟認為它的閃光點是:可以將複雜的頁面劃分為多個模組,然後用 Server.Execute 將這些模組集中在一個頁面顯示。
例子:
頁面First.aspx:
<%<br />string str = "this is first page! ";<br />Response.Write(str + "started...");<br />Server.Execute("SecondPage.aspx");<br />Response.Write(str + "End...");<br />%>
頁面SecondPage.aspx:
<%<br />string str = "this is the second page! "<br />Response.Write(str);<br />%>
執行First.aspx:顯示的結果為:
this is first page! starting...this is the second page! this is the first page! End...
看了這個結果是不是已經恍然大悟了??呵呵呵。。。
但是。。。別高興得太早了。。。因為我們在st或者html的模板頁面中,是要進行頁面配置的,如果處理不好的話就會影響到頁面的布局和樣式,因為Server.Execute是無傳回值的呀!!那怎麼處理這個問題呢?oh!~~
其實解決辦法很簡單。。如下:
TextWriter tw = new StringWriter();<br />HttpContext.Current.Server.Execute("SpecialTopicsDetail.aspx", tw);</p><p>string result = tw.ToString(); //做你想做的事情。。
是簡單吧?呵呵呵~
如果想利用使用者控制項完成的話也是可以的喲,具體方法請參考這裡:
Render User Control as String Template :
http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx
另外,在Server.Execute中,調用和被調用的檔案之間共用的內容有:
> Application 變數
> Session 變數
> Server 變數和屬性
> Request 集合和屬性,包括 Form、QueryString 資料。
> Response 集合和屬性,被調用的檔案可以更改 HTTP 頭資訊。但是同樣要求還沒有用 Response.Flush 向用戶端發送有資訊。
> Server.Execute 也可以形成遞迴,但遞迴達到一定的次數後不會像 Server.Transfer 一樣自動終止,而是報錯並終止。
ok,這裡只講了關鍵點的原理和實現,實際上基礎的東西都沒介紹,我想那些基礎的東西對於大家來說早就精通了。。。
本文中引用了不少作者的成果,在這裡也感謝他們的共用和付出,謝謝!
本文參考網址:
http://blog.csdn.net/ming_chang/archive/2009/06/01/4234426.aspx
http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx
http://www.cftea.com/c/2006/09/KMA6IL9SD8Y9P6GZ.asp