首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

anCMS 核心引擎:HTML 模板到 ASPX 動態編譯的實現解析

     編輯:ASP.NET 基礎

專案背景

anCMS (C# 版) 採用「標籤替換」核心機制:解析 HTML 模板中的自定義標籤,動態轉換為可執行的 ASPX 程式碼並執行。本文揭秘核心類 HtmlToAspxMethod 與 ConvertHtmlToAspx 的完整實現邏輯。

核心類架構

1. HtmlToAspxMethod:標籤解析與映射引擎

負責定義標籤名稱映射、正則表達式模式、參數提取、佔位符替換、URL 路由生成、分頁標籤處理、分割循環邏輯等核心功能。

標籤名稱映射表

list → TextFile          listpager → TextFilePager
alist → Article          alistpager → ArticlePager
plist → Products         plistpager → ProductsPager
olist → One              olistpager → OnePager
clist → Category         clistpager → CategoryPager
llist → Link             llistpager → LinkPager
ilist → Images           ilistpager → ImagesPager

關鍵正則模式

  • AllMethodContentRegex:匹配完整標籤塊(含內容)
  • AllMethodRegex:提取單個標籤聲明
  • MethodNameRegex / MethodFiledRegex:解析方法名與參數
  • ValueOneRegex / ValueOneToStringFormartRegex:處理 ${n} 與 ${n|format} 佔位符
  • UrlRouteRegex / PagingRegex:生成路由與分頁程式碼
  • FnSplitRegex:實現 循環邏輯

參數解析與轉換

HtmlFiledToAspxFiled 將標籤屬性轉為強型別 AspxFiled 物件,包含欄位、排序、分類、關鍵字、分頁數、當前頁等屬性。

動態程式碼生成

  • AspxMethodDataSet:生成資料源填充程式碼(MyHashtable.Add(...))
  • AspxMethodDataRow:生成資料繫結迴圈(foreach (var a in myRows))
  • ServerFunction:包裝為 <script runat="server"> 伺服器端腳本塊

2. ConvertHtmlToAspx:模板轉換協調器

轉換流程

  1. AllToAspx 預處理:全域佔位符替換($categoryname、URL 路由、分頁、分割標籤)
  2. 遍歷所有標籤塊:
    1. 提取標籤聲明、參數、模板內容
    2. 處理佔位符與格式化
    3. 生成唯一資料表名稱
    4. 生成資料源程式碼 + 繫結迴圈程式碼
    5. 替換原始標籤塊為生成的 ASPX 程式碼
  3. 處理 JS 引用與靜態資源路徑轉換(HrefHtml)
  4. 輸出:伺服器端腳本塊 + 轉換後的 HTML

核心優勢與特點

  • 極簡核心: 僅靠正則替換實現模板引擎,無需複雜編譯器
  • 擴展性強: 新增標籤只需擴展映射表與對應業務方法
  • 效能考量: 採用 MyHashtable 緩存資料集,減少重複查詢
  • 靈活佈局: 支援巢狀循環、條件判斷、格式化輸出

代碼片段精華

分頁標籤轉換邏輯

public static string Paging(string content) {
    // $pager[list][Category=$category$][15]
    // → <%=Paging("list",new{Category=$category$},15,a[0])%>
    foreach (string s in Method.RegexStr(PagingRegex, content)) {
        // 解析參數,構造 Paging 呼叫程式碼
        content = content.Replace(s, generatedCode);
    }
    return content;
}

分割循環實現

public static string FnSplit(string content) {
    // ${field}[,]...
    // 生成 foreach(var s in arr.Split(',')) 迴圈
}

結語

anCMS 展示了「約定優於配置」的輕量級 CMS 核心思想:以最小代價實現最大靈活性。雖代碼看似「膚淺」,卻精準解決了模板與數據分離、動態編譯、擴展性等核心問題,是中小型企業站點的理想選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved