Razor 的內嵌模板功能鮮為人知,實則允許將標記片段作為委派傳遞給 Helper 方法。本文以 Repeat Helper 為例,解析模板產生的 IL 代碼與使用方式。
@Repeat(10, @<li>List Item</li>);
輸出 10 個 <li>List Item</li>。
public static IHtmlString Repeat(int count, Func<dynamic, HelperResult> template)
{
var result = new StringBuilder();
for (int i = 0; i < count; i++)
result.Append(template(null).ToHtmlString());
return new HtmlString(result.ToString());
}
Func<dynamic, HelperResult>,Razor 編譯器將 @<li>...</li> 轉換為可呼叫的委派。HelperResult 封裝輸出寫入邏輯,支援串流式輸出。__razor_template_writer.Write(Repeat(10,
new Func<dynamic, HelperResult>(__template_param) => {
return new HelperResult(__tw => {
__tw.Write("List Item ");
});
})
));
@Repeat(5, @<li>Item @item.Index</li>);
Helper 內可傳入模型物件:template(new { Index = i }),模板中透過 @item.Index 存取。
內嵌模板將標記片段第一級化為可傳遞、可組合的程式碼單元,極大擴展 Razor 的表達能力,適合建構可重用 UI 組件庫。