1

我目前正在尝试在 C# 中使用 DotLiquid,并且我观察到了一种我不太了解的行为。由于我对 C# 不是很熟悉,我无法确定我的问题是与 C# 本身还是 DotLiquid 相关,所以请多多包涵。=)

我有一个非常基本的东西index.liquid,我试图将Table-object 传递给它。为了开始,我已经重写toString()以简单地创建一个表示,现在,我稍后想要使用实际的对象。尝试使用模板时,这就是我所做的:

public static void createHTML(DataTable table)
{
    string templatePath = @"C:\Path\To\index.liquid";
    var template = Template.Parse(templatePath);
    template.Render(Hash.FromAnonymousObject(new
    {
        table = DataMapper.createTable(table).toString()
    });

    using (StreamWrite file = new StreamWriter(@"C:\Some\Path\test.html"))
    {
        file.write(template.Render());
    }
}

现在,当我打开这个新创建test.html的 ,它只包含C:\Path\To\index.liquid,这意味着我没有正确加载我的模板。看着Try to use DotLiquid with c# 我会认为我正在正确加载模板并使用 File.ReadAllText(templatePath));向我展示了templatePath指向正确的文件。

这表明我不了解一些非常基本的东西,Template.Parse()或者Template.Render()源代码没有为我提供我所缺少的洞察力,所以希望你能帮助我。

4

2 回答 2

2

希望避免其他人被绊倒。输出是文件路径的真正原因是因为Template.Parse(string source)需要实际的模板内容,而不是文件路径。

为了完成您正在尝试的事情,您需要以这种方式使用它:

Template template = Template.Parse(File.ReadAllText(templatePath));
于 2018-04-20T20:27:41.653 回答
1

没有 的内容很难判断index.liquid,但已经有一件事需要解决:你调用Render了两次,第二次没有你的对象。

尝试这个:

public static void createHTML(DataTable table)
{
    string templatePath = @"C:\Path\To\index.liquid";
    var template = Template.Parse(templatePath);

    using (StreamWrite file = new StreamWriter(@"C:\Some\Path\test.html"))
    {
        file.write(template.Render(Hash.FromAnonymousObject(new
        {
            table = DataMapper.createTable(table).toString()
        })));
    }
}

如果这不起作用,请更新您的问题以添加index.liquid.

于 2017-06-29T09:20:18.770 回答