据我所知,DotLiquid(使用版本 1.8.0.0)不支持Dictionary
开箱即用的 C# 构造。它们必须包装在Drop
-Object 中。
因此,我尝试将 Tim Jones 的答案改编为我的用例。可悲的是,这没有按预期工作,所以我希望有人能告诉我我哪里出了问题,因为我没有想法。
这是包含字典的(其中一个)包装模型类:
public class LegendAdditive : Drop
{
public LegendAdditive()
{
AdditiveDict = new Dictionary<string, string>();
}
public Dictionary<string, string> AdditiveDict { get; set; }
}
类本身嵌入在LegendModel
包含一些其他值的 a 中:
public class LegendModel: Drop
{
...
public LegendAdditive Additives { get; set; }
...
}
如您所见,所有的类都被包装成 a Drop
,据我所知,这是使用字典的先决条件(实现 ILiquidizable 等)。
在转换器中,这个模型是这样填充的:
public DotLiquid.Drop GetModel(MyObject plan)
{
...
var LegendAdditives = new LegendAdditive();
//dbLegend.Additives is a Dictionary<string, string> itself.
if (dbLegend.Additives.Any())
foreach (var additive in dbLegend.Additives.OrderBy(a => a.Key))
LegendAdditives.AdditiveDict.Add(additive.Key, additive.Value);
...
LegendModel model = new LegendModel
{
...
Additives = LegendAdditives,
...
};
return model;
}
在一个类ConvertToPdf
中,我有一个ConvertTemplate
这样的方法,解析模板:
public static string ConvertTemplate(ITemplateFileFactory templateFilePathFactory IDropModelConverter modelConverter, MyObject mplan)
{
//reading my filepath out of the factory here...
DotLiquid.Template.NamingConvention = new DotLiquid.NamingConventions.CSharpNamingConvention();
Template templateObj = Template.Parse(template); // Parses and compiles the template
Drop plan = modelConverter.GetModel(mplan);
Hash hashedValues = Hash.FromAnonymousObject(new { plan });
string ret = templateObj.Render(hashedValues);
return ret;
}
最后在我的模板文件中,我尝试像这样获取此字典的值:
<div>
<dl>
{% for add in plan.Additives.AdditiveDict %}
<dt>{{add.Key}}</dt>
<dd>{{add.Value}}</dd>
{% endfor %}
</dl>
</div>
现在文件正在正确解析,但是当我尝试访问循环中的 Dictionaryvalues 时,我现在得到的只是这个输出:
Liquid syntax error: Object '[18, Stärke]' is
invalid because it is neither a built-in type
nor implements ILiquidizable
现在看来,我实际上在我的 Template.Parse 方法中得到了正确的值。我只是没有让它们脱离我的结构,因为......?任何帮助表示赞赏。老实说,我认为我在这里基本上遗漏了一些东西。