2017-02-08 135 views
1

我正在調查使用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,它似乎相當強大的(可能是矯枉過正的我的需要?)。我有它的工作,但我想問一下,如果我以正確的方式去解決這個問題?

看來我被迫宣佈一個類即viz。

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();]與它下面的模板變量聲明聯繫。是否有某種全局緩存正在進行?

回答

3
  1. 是的,從Drop繼承是一種方法。 DotLiquid提供的另一種機制是Template.RegisterSimpleType(...) - 有關示例,請參閱unit tests

  2. 是的,您需要用變量的名稱來限定屬性名稱,如您的示例中所示。替代方案是創建一個Hash,其中包含AdditionalInformation,Description,ErrorId的頂級密鑰,並將其傳遞給template.Render(...)。您可以使用Hash.FromDictionary(...)來做到這一點,如here所示。

  3. 命名約定沒有連接到變量聲明。命名約定僅在解析屬性名稱時使用。例如,如果您使用RubyNamingConvention,那麼您需要在模板中編寫{{ emailTemplateInfo.additional_information }}

+0

Re 1.這很好,因爲我保持我的模型分離,現在他們不需要對DotLiquid的引用。測試和工作 - 感謝Re 2. - 在單元測試中的任何示例Re 3. - 「template」(小寫)如何知道它是使用C#約定而不是Ruby?是否有某種全局緩存正在進行? – noonand

+0

Re(2),我已經更新了我的答案,以包含一個指向'Hash.FromDictionary'示例用法的鏈接。 Re(3),'Template。NamingConvention'是一個靜態屬性,所以它是全球性的。不是一個很好的API設計,但在我的防守DotLiquid是我的第一個開源項目,我真的不知道我在做什麼:) –

+0

蒂姆,非常感謝,我感謝你所付出的所有努力(並繼續放入)這個項目。它完成了我所要求的一切,像靜態支柱這樣的小事物(恕我直言)是微不足道的。感謝您對這個問題的幫助。 – noonand