DotLiquid,一些初学者的问题/观察

时间:2017-02-08 10:34:09

标签: c# .net template-engine liquid dotliquid

我正在调查使用dotliquid替换本土成长的模板代码,并且我想知道实现目标的最佳方法。

旧代码用于在模板中使用sigils,并与Dictionary一起使用正则表达式进行搜索和替换。所以你在模板文件中做了类似的事情:

Specific error: {#ErrorId#}
Error description: {#Description#}
Additional information:{#AdditionalInformation#}

在C#代码中:

Dictionary<string, string> tokensAndValues = new Dictionary<string, string>
{
    {@"ErrorId", errorId},
    {@"Description", description},
    {@"AdditionalInformation", additionalInformation}
};

我遇到了dotnetliquid,它看起来非常强大(可能对我的需求有些过分?)。我已经开始工作,但我想问一下我是否能以正确的方式解决这个问题?

我似乎被迫宣布上课。

public class EmailTemplateInfo : Drop
{
    public string ErrorId { get; set; }
    public string Description { get; set; }
    public string AdditionalInformation { get; set; }
}

然后使用如下:

Template.NamingConvention = new CSharpNamingConvention();
Template template = Template.Parse(templateText);

EmailTemplateInfo emailTemplateInfo = new EmailTemplateInfo
{
    AdditionalInformation = additionalInformation,
    Description = description,                    
    ErrorId = errorId
};

string htmlText = template.Render(Hash.FromAnonymousObject(new {emailTemplateInfo = emailTemplateInfo }));

几个问题:

  1. 这是正确的方法吗?如果是,那么我建议对演示此功能的文档进行添加。

  2. 其次在我使用的模板中,我需要使用这个变量的名称限定占位符吗?

    Specific error: {{emailTemplateInfo.ErrorId}}
    Error description: {{emailTemplateInfo.Description}}
    Additional information:{{emailTemplateInfo.AdditionalInformation}}
    
  3. 我无法看到命名约定声明[Template.NamingConvention = new CSharpNamingConvention();]如何与其下面的模板变量声明联系起来。是否存在某种全局缓存?

1 个答案:

答案 0 :(得分:4)

  1. 是的,继承自Drop是一种方法。 DotLiquid提供的另一种机制是Template.RegisterSimpleType(...) - 有关示例,请参阅unit tests

  2. 是的,您需要使用变量名称限定属性名称,如示例所示。另一种方法是为HashAdditionalInformationDescription创建包含顶级密钥的ErrorId,并将其传递给template.Render(...)。您可以使用Hash.FromDictionary(...)执行此操作,如here所示。

  3. 命名约定没有与变量声明的连接。命名约定仅在解析属性名称时使用。例如,如果您使用了RubyNamingConvention,那么您需要在模板中编写{{ emailTemplateInfo.additional_information }}