我使用 StringTemplate4 允许用户将 HTML 模板和页面 ID 传递给 Web 服务,然后获取解析结果。字段的名称和数量是动态的,这意味着虽然某些页面可能只为给定字段返回一个值,但其他页面可能会返回许多值。一个例子是页面 URL。每个页面可以有多个 URL,但第一个应该被视为默认 URL(规范 URL)。我希望我的用户能够添加$url$
到模板中,它只是吐出第一个 URL。我知道 StringTemplate 不提供数组索引,所以我不能只说$url[0]$
,所以我采取了不同的方法。这是我的代码:
public class TemplateField : Dictionary<string, dynamic>
{
// Empty class
}
public class TemplateValue : List<string>
{
public override string ToString(){
return this.FirstOrDefault();
}
}
// This is a test method to render a template using my planned objects
public static string ReplaceTokens()
{
var template = @"
<Title>$Title$</Title>
<ul class=""menu"">
$menu:{m|<li><a href=""$m.url$"">$m.name$</a></li>};separator=""\n""$
</ul>";
var g = new TemplateGroup('$','$');
var t = new Template(g,template);
var menu = new List<TemplateField>();
var item1 = new TemplateField();
item1.Add("name", new TemplateValue { "Home" });
item1.Add("url", new TemplateValue {
"/home",
"/index",
"/default"
});
t.Add("menu",item1);
var item2 = new TemplateField();
item2.Add("name", new TemplateValue { "About Us" });
item2.Add("url", new TemplateValue { "/about-us" });
t.Add("menu", item2);
var item3 = new TemplateField();
item3.Add("name", new TemplateValue { "Contact" });
item3.Add("url", new TemplateValue { "/contact" });
t.Add("menu", item3);
t.Add("Title", new TemplateValue { "My test" });
return t.Render();
}
因此,正如您通过查看我的模板所看到的那样,我希望它$m.url$
会呈现“/home”而不是“/home/index/default”,就像它目前正在做的那样。我试图通过覆盖 TemplateValue 类上的 ToString() 方法来实现这一点,但无济于事。我试图查看 StringTemplate 的源代码,但找不到一种方法来更改对象在呈现时返回的值。谁能指出我正确的方向?