前言:
先說說大伙關心的工作上的事,在上家公司任了一個多月的技術經理后,和公司中止了合作關系。
主要原因在於一開始的待遇沒談的太清楚:
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的文本數據庫來演示:
先寫個函數,創建文本數據庫和添加數據:
void TxtDBCreate()
{
MDataTable.CreateSchema( " demo.txt ", false, new 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數據:
文本數據庫相當於創建好了,配置里添加一行數據庫鏈接請求:
< add name ="Conn" connectionString ="txt path={0}" />
</ connectionStrings >
3.2 項目示例代碼:
弄好數據庫,可以寫代碼了,單條數據的標簽替換:
{
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); // 輸出模板
}
}
代碼解答:
只要把數據行賦給模板,加一個任意前綴,之后就可以在html中任意使用:{$txt#Name} 或{$txt-CreateTime}或{$txt#ID}來代表數據的值。
'#','-'是默認的前綴分隔符號,任意使用其一都可。
{$字段名} 這個是因為大多數的模板引擎都采用這種,故采用這種通用方式。
上面的代碼中,有兩行是注釋的,是多行數據的(表循環),方法是:LoadData(MDataTable);
如果把上面的代碼注釋放開,Html如下:
< 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。
對於框架,有時候研究的再深,也不如自己寫一個淺的。