DotLiquid:在模板中的 for 循环中循环遍历(包装的)字典 <string, string>
DotLiquid: Loop through a (Wrapped) Dictionary<string, string> in for-loop in template
据我所知 know,DotLiquid(使用版本 1.8.0.0)不支持开箱即用的 C# Dictionary
构造。它们必须包裹在 Drop
-Object.
中
所以我尝试将 Tim Jones 的答案改编为我的用例。可悲的是,这没有按预期工作,所以我希望有人能告诉我哪里出了问题,因为我没有想法。
这是我的包装模型 class 的(其中之一)包含字典:
public class LegendAdditive : Drop
{
public LegendAdditive()
{
AdditiveDict = new Dictionary<string, string>();
}
public Dictionary<string, string> AdditiveDict { get; set; }
}
class 本身嵌入在包含其他一些值的 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;
}
在 class 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 方法中的正确值。我只是没有让他们离开我的结构,因为......?任何帮助表示赞赏。老实说,我想我在这里遗漏了一些根本性的东西。
问题是您尝试访问 Key
和 Value
属性的 KeyValuePair<T>
既不是 Drop
也没有实现 ILiquidizable
.
如果您想像那样循环遍历字典中的项目,则必须创建一个 KeyValueDrop
包装器,并公开其中的 List
,而不是字典。
据我所知 know,DotLiquid(使用版本 1.8.0.0)不支持开箱即用的 C# Dictionary
构造。它们必须包裹在 Drop
-Object.
所以我尝试将 Tim Jones 的答案改编为我的用例。可悲的是,这没有按预期工作,所以我希望有人能告诉我哪里出了问题,因为我没有想法。
这是我的包装模型 class 的(其中之一)包含字典:
public class LegendAdditive : Drop
{
public LegendAdditive()
{
AdditiveDict = new Dictionary<string, string>();
}
public Dictionary<string, string> AdditiveDict { get; set; }
}
class 本身嵌入在包含其他一些值的 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;
}
在 class 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 方法中的正确值。我只是没有让他们离开我的结构,因为......?任何帮助表示赞赏。老实说,我想我在这里遗漏了一些根本性的东西。
问题是您尝试访问 Key
和 Value
属性的 KeyValuePair<T>
既不是 Drop
也没有实现 ILiquidizable
.
如果您想像那样循环遍历字典中的项目,则必须创建一个 KeyValueDrop
包装器,并公开其中的 List
,而不是字典。