就我know而言,DotLiquid(使用版本1.8.0.0)不支持开箱即用的C#Dictionary
构造。它们必须包裹在Drop
- 对象中。
所以我尝试将Tim Jones的答案改编为我的用例。可悲的是,这没有达到预期的效果,所以我希望有人能告诉我这里我出错的地方,因为我没有想法。
这是我的包装模型类中的一个,其中包含一个Dictionary:
public class LegendAdditive : Drop
{
public LegendAdditive()
{
AdditiveDict = new Dictionary<string, string>();
}
public Dictionary<string, string> AdditiveDict { get; set; }
}
类本身嵌入在LegendModel
中,其中包含一些其他值:
public class LegendModel: Drop
{
...
public LegendAdditive Additives { get; set; }
...
}
如您所见,所有类都被包装为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;
}
最后在我的Templatefile中,我试着像这样得到这个字典的值:
<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方法中的正确值。我只是没有让他们离开我的结构,因为......?任何帮助表示赞赏。说实话,我认为我在这里从根本上缺少一些东西。
答案 0 :(得分:1)
问题在于,您尝试访问KeyValuePair<T>
和Key
属性的Value
既不是Drop
也不是ILiquidizable
如果你想循环浏览字典中的项目,你必须创建一个KeyValueDrop
包装器,并公开List
,而不是字典。