CMS模板引擎:XHtmlAction


前言:

先說說大伙關心的工作上的事,在上家公司任了一個多月的技術經理后,和公司中止了合作關系。

主要原因在於一開始的待遇沒談的太清楚: 

1:沒有合同,沒有公積金,連社保也沒交。

2:工資的30%變成了績效(對我還實行特例,按季度或按項目發,而且績效只有按期完成(發)與沒完成(不發))

3:稅后的問題,要自己去弄發票來填。

只能說緣來的太快,份走的也太快。

 

對於工作上的事,一個多月的時間,從需求文檔到概要文檔到詳細文檔,到產品原型到系統架構,基本上已經走完了。

項目成員也招聘完成,開發的按我的計划穩定的進行着,所有的技術難點,我都提前解決了。 

雖然人走,但后續剩下點的任務也安排好了,剩下的開發有種沒了我依然一切如舊的悲涼感覺。


交待完前事,下面進入技術正題。 

1:ASP.NET的模板引擎(也稱視圖引擎):ASPX和Razor 簡單介紹

如圖有兩種視圖引擎:

 

微軟視圖引擎的基本原理:

加載模板(aspx、cshtml)-》調用引擎解析成(語法樹)-》生成CS代碼-》動態編繹-》返回最終模板。

 

相對來說,這種模板引擎,性能相對來說會下降一些,但是搭載VS IED的智能提示,和大伙多年的開發習慣,已經占據了主流。

 

對於Razor有興趣研究的,想深入的可以下載源碼去慢慢慢慢研究,Razor 的源碼(取自mvc5源碼的razor項目):點擊下載

這里也有篇Razor的原理基礎文章,可供參考:  http://www.cnblogs.com/JamesLi2015/p/3213642.html

源碼目錄截圖:

 

2:CYQ.Data 模板引擎:XHtmlAction:

XHtmlAction模板引擎的基本原理:

 

和ASP.NET自帶的模板引擎比較,這里沒有語法樹、生成代碼和動態編繹過程,因此可以得到高性能的體驗。

另外相對來說,對Xml及XPath語法的操作進行了封裝,簡化了很多后台開發代碼。

當然相對缺點就是不能在模板里混合寫后台代碼了,換個說法是沒有強大的IDE智能提示(若換個角度看,也成優點,模板和后台代碼真正分離了)。 

XHtmlAction實現也相當的輕量級,一共就6個文件,老少皆宜,有興趣研究的可以看 CYQ.Data V4.55的源碼:

 

曾經也寫過兩篇相關的文章:

1:多語言的(MutilLanguage),可以讓你很輕松的編寫多語言網站:實戰篇-簡單多語言的實現

2:XHmlAction的使用(以前類名叫XmlHelper,用法是一樣的):CYQ.Data.Xml XmlHelper 助你更方便快捷的操作Xml/Html


除了介紹的(XmlHelper)用法,最近V5版本增加了“CMS標簽替換”功能,下面介紹。

 

3:XHtmlAction CMS標簽替換功能介紹:

3.1 這里用CYQ.Data的文本數據庫來演示:

先寫個函數,創建文本數據庫和添加數據:

  // 創建文件數據庫,並添加50條數據。
     void TxtDBCreate()
    {
        MDataTable.CreateSchema( " demo.txt "falsenew  string[] {  " Name "" CreateTime " },  new SqlDbType[] { SqlDbType.NVarChar, SqlDbType.DateTime });
         using (MAction action =  new MAction( " demo "))
        {
             for ( int i =  0; i <  50; i++)
            {
                action.Set( " Name "" Name_ " + i.ToString());
                action.Set( " CreateTime ", DateTime.Now.AddSeconds(i));
                action.Insert();
            }
        }
    }

該代碼執行后,生成兩個文件:demo.ts(表結構)demo.txt(json格式的表數據)

 

文本里的Json數據:

 

文本數據庫相當於創建好了,配置里添加一行數據庫鏈接請求:

< connectionStrings >
         < add  name ="Conn"  connectionString ="txt path={0}" />
     </ connectionStrings >

3.2 項目示例代碼:

弄好數據庫,可以寫代碼了,單條數據的標簽替換:

  protected  void Page_Load( object sender, EventArgs e)
    {
       
         using (XHtmlAction xml =  new XHtmlAction( true))
        {
            xml.Load(Server.MapPath( " demo.html ")); // 加載html模板。
             using (MAction action =  new MAction( " demo "))  // 數據庫操作,操作demo表。
            {
                 if (action.Fill( 1)) // 查詢id=1的數據
                {
                    xml.LoadData(action.Data,  " txt ");//將查詢的數據行賦給XHtmlAction,並指定CMS前綴
                }
                 // xml.LoadData(action.Select());
                
// xml.SetForeach("divFor", SetType.InnerXml);
            }
            Response.Write(xml.OutXml); // 輸出模板
        }
    }

代碼解答: 

代碼的關鍵就在於方法:LoadData(MDataRow,autoSetValuePre)
只要把數據行賦給模板,加一個任意前綴,之后就可以在html中任意使用:{$txt#Name} 或{$txt-CreateTime}或{$txt#ID}來代表數據的值。
'#','-'是默認的前綴分隔符號,任意使用其一都可。
{$字段名} 這個是因為大多數的模板引擎都采用這種,故采用這種通用方式。
上面的代碼中,有兩行是注釋的,是多行數據的(表循環),方法是:LoadData(MDataTable); 

如果把上面的代碼注釋放開,Html如下:

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head >
     < title >{$txt#Name} </ title >
</ head >
< body >
< div  title ="單條數據"   >
單條數據:{$txt#Name} - {$txt-CreateTime}
</ div >
< hr  />
< div  id ="divFor"  title ="多條數據"   >
{$Name} - {$CreateTime} < br  />
</ div >
</ body ></html>

最終效果輸出如下圖:

 

 

本Demo源碼下載: 點擊下載

4:XHtmlAction 關鍵點

1:字段前綴:

對於一個html,可能涉及到相同的字段名(同表的不同行數據,不同表的數據)需要標簽替換,因此LoadData(數據行,前綴)方法需要前綴來區分。

同時前綴也可以傳空"",不使用前綴(但要注釋避免和其它的沖突)。

對於行的數據,是在獲取xml.OutXml屬性的時候才處理,因為對於標簽,可以存在任意地方,因此不能以節點來處理,只能在最終輸的時候,拿到html,再用正則替換。

 

2:表格輸出:

對於表格的輸出,需要獲取某個節點,以對節點下的內容,進行克隆復制循環輸出,由於已經存在節點,所以在xml.SetForeach的時候就處理了。

如果涉及到字段格式化,仍按SetForeach的事件處理即可。

 

3:示例說明:

本文及示例介紹的是標簽替換的功能,節點替換的操作方式,仍和以前的操作方式一致。


總結:

對於Web開發框架,主打關鍵就三塊:URL重寫(路由)、模板引擎(視圖引擎)、數據層框架(ORM)。

如果你能掌控或自由實現這三模塊,你的開發方式選擇就自由化很多,如果不能,你只能局域於微軟給你的WebForm和MVC。

對於框架,有時候研究的再深,也不如自己寫一個淺的。 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM