繁体   English   中英

StringTemplate C#覆盖数组的行为

[英]StringTemplate C# override array behaviour

我正在使用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的源代码,但找不到改变呈现对象时返回的值的方法。 谁能指出我正确的方向?

您可以使用$first(url)$ 如果项目不是数组(或集合),则此表达式的结果就是项目本身。

最后,我最终切换到XSLT。 我本来避免使用它,因为我认为它不够优雅(例如,与Razor相比)。 但是要胜过一个缺点有很多优点:

  • 只要我可以将类表示为XML,就可以将传递给模板解析器的对象的复杂性提高到任何程度。
  • 我不需要任何自定义类(例如TemplateField和TemplateValue)来表示我的对象:简单的XML即可。
  • 这是一项标准技术,因此支持比我从第三方库获得的要好得多,并且使新开发人员快速入门将变得容易得多。
  • 它使我可以在模板中使用标准逻辑。
  • 有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM