【问题标题】:DotLiquid, some beginner questions/observationsDotLiquid,一些初学者的问题/观察
【发布时间】:2017-06-25 22:17:45
【问题描述】:

我正在研究使用 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,它看起来非常强大(可能超出了我的需求?)。我已经让它工作了,但我想问一下我是否以正确的方式处理这个问题?

看来我不得不声明一个类即。

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();] 如何与它下面的模板变量声明联系在一起。是否正在进行某种全局缓存?

【问题讨论】:

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


    【解决方案1】:
    1. 是的,从Drop 继承是一种方法。 DotLiquid 提供的另一种机制是Template.RegisterSimpleType(...) - 有关示例,请参见unit tests

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

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

    【讨论】:

    • Re 1. 这很好,因为我将模型分开,现在它们不需要引用 DotLiquid。经过测试并且可以工作 - 感谢 Re 2。 - 单元测试 Re 3 中的任何示例。 - “模板”(小写)如何知道它是使用 C# 约定而不是 Ruby 约定?是否正在进行某种全局缓存?
    • Re (2),我已经更新了我的答案,包括一个指向 Hash.FromDictionary 示例用法的链接。 Re (3), Template.NamingConvention 是一个静态属性,所以它是全局的。不是一个很棒的 AP​​I 设计,但在我的辩护中,DotLiquid 是我的第一个开源项目,我真的不知道我在做什么 :)
    • Tim,非常感谢,感谢您为这个项目付出(并继续付出)的所有努力。它完成了我对它的所有要求,并且像静态道具这样的小东西(恕我直言)微不足道。也感谢您对这个问题的帮助。
    • @TimJones 为什么人们如此关注Drops?我将Template.RegisterSafeType(Type, string[]) 与包含其他模型的复合嵌套模型一起使用,字典效果很好。我唯一的问题 - 如何使用{{ model.dict.key | filter }} 并应用特定的文化,只是不像... filter:"xx-Xx" 基本上,Context 在过滤器中可用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多