有没有一种方法可以使用C#在Scriban中动态地索引对象?

时间:2020-06-30 14:49:18

标签: c# xetex scriban

使用PDF生成器,它使用了模板引擎Scriban和LaTeX。尽管我似乎无法引用C#对象,但Scriban试图通过索引符号读取(使用数组此索引处的数据)。我的意思是这样的:

{~for index in 0..document.template_data.tables.size~}} 
  {{ document.template_data.tables[index].data_matrix }}
{{ end }}

我得到:Object document.template_data.tables[index] is null,这最终意味着编译器无论出于何种原因都无法检索该对象。


问:数据实际上在对象中吗? 答:是的,我用0和1之类的数字进行了硬编码,并获得了相关数据。我尝试访问的两个字段就是这种情况。问题是试图动态生成表。

问:数组有大小吗? 答:我已经在scriban中浏览了,只是吐出了大小。有5张桌子。

问:您从事研究吗? 答:是的,这是github上的一些人,告诉人们问题已解决

Does Scriban support .NET Object Indexers?

Accessing object property using indexer notation

1 个答案:

答案 0 :(得分:0)

您的问题实际上与索引超出范围有关。您正在遍历0-表的大小。换句话说,该对象为null,因为您正尝试访问最后一个条目之后的内容。我创建了一些超级简单的POCO,以填充类似于您的代码的对象。

public class Document
{
    public Data TemplateData { get; set; }
}
public class Data
{
    public List<TableRow> Tables { get; set; }
}
public class TableRow
{
    public string DataMatrix { get; set; }
}

这是更新的脚本,用于遍历表

var bodyTextSub = @"{{~for index in 1..document.template_data.tables.size ~}} 
{{index - 1}}: {{ document.template_data.tables[index-1].data_matrix }}
{{ end }}";
var doc = new Document
{
    TemplateData = new Data
    {
        Tables = new List<TableRow>
        {
            new TableRow {DataMatrix = "This works!!"},
            new TableRow {DataMatrix = "Row 2"},
            new TableRow {DataMatrix = "Row 3"},
            new TableRow {DataMatrix = "Row 4"},
            new TableRow {DataMatrix = "Row 5"}
        }
    }
};
var template2 = Template.Parse(bodyTextSub);
var result2 = template2.Render(new {document = doc});
Console.WriteLine(result2);     

这是结果:

0: This works!!
1: Row 2
2: Row 3
3: Row 4
4: Row 5