如何用C#库编译Mustache模板(不渲染数据与区块,仅合并部分模板)
解决方案
用Stubble实现的方法
Stubble本身没提供直接合并模板且不填充数据的API,但可以通过自定义部分模板加载逻辑,解析模板节点后手动拼接出合并后的模板文本。
具体步骤和代码示例:
using Stubble.Core; using Stubble.Core.Builders; using Stubble.Core.Loaders; using System.Collections.Generic; using System.Linq; // 定义主模板和部分模板内容 var mainTemplate = @"{{ Foo }} {{ > SomePartial}} {{ #SomeSection }} world {{ /SomeSection }}"; var partials = new Dictionary<string, string> { { "SomePartial", "hello" } }; // 自定义部分模板加载器 var partialLoader = new DictionaryPartialLoader(partials); // 初始化Stubble解析器 var stubble = new StubbleBuilder() .ConfigurePartialLoader(_ => partialLoader) .Build(); // 解析模板成节点集合 var templateNodes = stubble.Parse(mainTemplate); // 遍历节点,替换部分模板引用为实际内容 var mergedTemplate = string.Join("\n", templateNodes.Select(node => { if (node is Stubble.Core.Tokens.PartialToken partialToken) { return partials[partialToken.Identifier.Name]; } return node.ToString(); })); // 输出合并后的模板 Console.WriteLine(mergedTemplate);
注意:这种方式依赖Stubble的内部节点结构,后续库版本更新可能需要适配调整。
更省心的选择:Mustache-Sharp
如果不想折腾Stubble的内部逻辑,推荐用Mustache-Sharp——这个库原生支持不填充数据就合并模板,用法更稳定简单。
代码示例:
using Mustache; // 定义模板内容 var mainTemplate = @"{{ Foo }} {{ > SomePartial}} {{ #SomeSection }} world {{ /SomeSection }}"; var partialTemplate = "hello"; // 注册部分模板 var registry = new TemplateRegistry(); registry.RegisterPartial("SomePartial", partialTemplate); // 编译主模板并合并部分模板 var compiledTemplate = Template.Compile(mainTemplate, registry); // 获取合并后的模板文本(不填充任何数据) var mergedTemplate = compiledTemplate.RenderWithoutData(); // 输出结果 Console.WriteLine(mergedTemplate);
RenderWithoutData() 方法会直接返回合并了部分模板的文本,同时保留所有未填充的标签,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Olga Zhukova
相关产品推荐
相关产品推荐

