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

VTemplate 模板引擎進階應用:模板塊隔離、變數運算式與條件式資料輸出

     編輯:關於C#

1. <vt:template> vs <vt:include> 核心差異:變數作用域隔離

兩者皆可包含外部檔案,但 變數作用域機制截然不同:

特性<vt:template><vt:include>
變數隔離✅ 擁有獨立變數空間,外部同名變數互不干擾❌ 共享同一變數空間,引用相同變數實例
宿主模板成為內部標籤的 OwnerTemplate內部標籤宿主與外部相同
類比概念類別 (Class):封裝狀態與行為檔案包含 (Include):單純文字插入
外部存取內部變數可透過 template.Variables 存取不可區分,為同一變數

實際輸出差異示意



我是外部變量 {$:#.var1}
<vt:foreach from="#.names" item="name" index="i">
外部第 {$:#.i} 個名字叫 {$:#.name}
</vt:foreach>


<vt:template id="inc" file="inc_content.html" />


<vt:include id="inc" file="inc_content.html" />

若僅對外部 var1=1, names=[張三,李四] 賦值:

  • A (template):包含區塊 無輸出 (內部變數未賦值)
  • B (include):包含區塊 正常輸出 (共享外部變數)

2. 變數運算式 進階用法:手動設定動態計算屬性

當模板需顯示的屬性不存在於實體類別 (如「個人財產總額」需即時計算) 時,使用 Variable.SetExpValue:


// 模板中使用:{$:user.totalmoney}
// 實體類別無 totalmoney 屬性

Variable userVar = doc.Variables["user"];
User user = GetUserFromDb(); // 取得實體
userVar.Value = user;        // 1. 先設定實體值

// 2. 手動設定運算式值 (順序不可顛倒)
userVar.SetExpValue("totalmoney", CalculateTotalMoney(user));

適用場景

  • 衍生屬性:全名 = 姓 + 名、年齡 = 今年 - 出生年
  • 聚合計算:訂單總價 = Σ(商品價格 × 數量)
  • 格式化輸出:出生日期格式化為「民國年/月/日」
  • 權限控制:是否顯示編輯按鈕 = User.HasPermission("Edit")

3. 條件式資料輸出控制:透過標籤屬性與事件

案例:部落格側邊欄顯示「相關新聞」與「熱門新聞」,資料來源相同但篩選條件不同。

模板設計


<div class="side_block">
  <h3>相關新聞</h3>
  <vt:template name="topnews" type="relating" file="news_list.html" />
</div>
<div class="side_block">
  <h3>熱門新聞</h3>
  <vt:template name="topnews" type="hoting" file="news_list.html" />
</div>

包含檔案 news_list.html


<ul class="topnews">
  <vt:foreach from="#.newsdata" item="news" index="i" id="newslist">
    <li><a href="{$:#.news.url}" title="{$:#.news.title}">{$:#.news.title}...</a></li>
  </vt:foreach>
</ul>

後端控制程式碼


// 1. 取得所有名為 "topnews" 的模板塊
var templates = doc.GetChildTemplatesByName("topnews");

foreach (Template tpl in templates)
{
    // 2. 依標籤屬性 type 取得不同篩選條件的資料
    string type = tpl.Attributes.GetValue("type"); // "relating" 或 "hoting"
    List newsData = GetNewsByType(type);
    
    // 3. 設定該模板塊區域變數
    tpl.Variables.SetValue("newsdata", newsData);

    // 4. 取得 foreach 標籤,掛上 BeforeRender 事件動態產生 URL
    var tag = tpl.GetChildTagById("newslist");
    if (tag is ForEachTag foreachTag)
    {
        foreachTag.BeforeRender += (sender, e) => 
        {
            var currentNews = (News)((ForEachTag)sender).Item.Value;
            // 動態設定 {$:#.news.url} 運算式值
            ((ForEachTag)sender).Item.SetExpValue("url", GenerateNewsUrl(currentNews));
        };
    }
}

關鍵技術點總結

  1. 名稱統一 + 屬性區分:同名 vt:template 方便批次處理,自訂屬性 type 傳遞業務參數。
  2. 區域變數隔離:每個 vt:template 擁有獨立 Variables,互不干擾。
  3. BeforeRender 事件:在迴圈渲染每一項前觸發,可動態修改當前項的運算式值 (如產生 URL)。
  4. 關注點分離:模板只負責結構呈現,資料邏輯集中在後端 C# 程式碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved