DotLiquid,一些初学者 questions/observations
DotLiquid, some beginner questions/observations
我正在调查使用 dotliquid 来替换一段自己开发的模板代码,我想知道实现我的目标的最佳方法。
旧代码用于在模板中使用印记,并与字典一起使用正则表达式进行搜索和替换。所以你在模板文件中做了这样的事情:
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,它看起来非常强大(对我的需求来说可能有点矫枉过正?)。我已经开始工作了,但我想问一下我是否以正确的方式处理这个问题?
看来我不得不声明一个 class 即
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();
] 如何与其下面的模板变量声明联系起来。是否正在进行某种全局缓存?
是的,从 Drop
继承是一种方法。 DotLiquid 提供的另一种机制是 Template.RegisterSimpleType(...)
- 有关示例,请参见 unit tests。
是的,您确实需要用变量名称限定 属性 名称,如您的示例所示。另一种方法是创建一个 Hash
,其中包含 AdditionalInformation
、Description
、ErrorId
的 top-level 个键,并将其传递给 template.Render(...)
。您可以使用 Hash.FromDictionary(...)
来做到这一点,如图 here.
命名约定与变量声明没有关系。命名约定仅在解析 属性 名称时使用。例如,如果您使用 RubyNamingConvention
,那么您需要在模板中写入 {{ emailTemplateInfo.additional_information }}
。
我正在调查使用 dotliquid 来替换一段自己开发的模板代码,我想知道实现我的目标的最佳方法。
旧代码用于在模板中使用印记,并与字典一起使用正则表达式进行搜索和替换。所以你在模板文件中做了这样的事情:
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,它看起来非常强大(对我的需求来说可能有点矫枉过正?)。我已经开始工作了,但我想问一下我是否以正确的方式处理这个问题?
看来我不得不声明一个 class 即
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();
] 如何与其下面的模板变量声明联系起来。是否正在进行某种全局缓存?
是的,从
Drop
继承是一种方法。 DotLiquid 提供的另一种机制是Template.RegisterSimpleType(...)
- 有关示例,请参见 unit tests。是的,您确实需要用变量名称限定 属性 名称,如您的示例所示。另一种方法是创建一个
Hash
,其中包含AdditionalInformation
、Description
、ErrorId
的 top-level 个键,并将其传递给template.Render(...)
。您可以使用Hash.FromDictionary(...)
来做到这一点,如图 here.命名约定与变量声明没有关系。命名约定仅在解析 属性 名称时使用。例如,如果您使用
RubyNamingConvention
,那么您需要在模板中写入{{ emailTemplateInfo.additional_information }}
。