我正在调查使用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 }));
几个问题:
这是正确的方法吗?如果是,那么我建议对演示此功能的文档进行添加。
其次在我使用的模板中,我需要使用这个变量的名称限定占位符吗?
Specific error: {{emailTemplateInfo.ErrorId}}
Error description: {{emailTemplateInfo.Description}}
Additional information:{{emailTemplateInfo.AdditionalInformation}}
我无法看到命名约定声明[Template.NamingConvention = new CSharpNamingConvention();
]如何与其下面的模板变量声明联系起来。是否存在某种全局缓存?
答案 0 :(得分:4)
是的,继承自Drop
是一种方法。 DotLiquid提供的另一种机制是Template.RegisterSimpleType(...)
- 有关示例,请参阅unit tests。
是的,您需要使用变量名称限定属性名称,如示例所示。另一种方法是为Hash
,AdditionalInformation
,Description
创建包含顶级密钥的ErrorId
,并将其传递给template.Render(...)
。您可以使用Hash.FromDictionary(...)
执行此操作,如here所示。
命名约定没有与变量声明的连接。命名约定仅在解析属性名称时使用。例如,如果您使用了RubyNamingConvention
,那么您需要在模板中编写{{ emailTemplateInfo.additional_information }}
。