【问题标题】:DotLiquid Template Engine Example Output ProblemDotLiquid 模板引擎示例输出问题
【发布时间】:2020-06-10 09:55:53
【问题描述】:

我正在尝试使用来自http://dotliquidmarkup.org/try-online 的示例。 我使用 NuGet 包 DotLiquid 有以下代码

命名空间 TestDotLiquidLoop {

public class User : Drop
{
    public string Name { get; set; }
    public List<Task> Tasks { get; set; }
}

public class Task
{
    public string Name { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        //Console.WriteLine("Hello World!");

        //const string template1 = "{{ user.name | upcase }} has to do:{% for item in user.tasks -%}{ { item.name } }{% endfor -%}";
        const string template = "<p>{{ user.name | upcase }} has to do:</p>" +
            "< ul >{% for item in user.tasks -%}" +
            "< li >{ { item.name } }</ li >" +
            "{% endfor -%}" +
            "</ ul > ";
        Template preparedTemplate = Template.Parse(template);


        var user = new User
        {
            Name = "Tim Jones",
            Tasks = new List<Task>
        {
            new Task { Name = "Documentation" },
            new Task { Name = "Code comments" }
        }
        };
        Console.WriteLine(preparedTemplate.Render(DotLiquid.Hash.FromAnonymousObject(new { tempuser = user })));

    }
}

}

我没有正确获得输出。我的输出是这样的。我知道这很愚蠢,但谁能帮我解决这个问题?

<p> has to do:</p>< ul ></ ul >

【问题讨论】:

    标签: c# template-engine dotliquid


    【解决方案1】:

    您可能错过了new { tempuser = user },您在某些时候将匿名对象属性重命名为tempuser。这个new { user } 等价于这个new { user = user }。要在模板内引用tempuser,您只需更改名称。

            string template = "<p>{{ tempuser.name | upcase }} has to do:</p>" +
                                    "< ul >{% for item in tempuser.tasks -%}" +
                                    "< li >{{ item.name }}</ li >" +
                                    "{% endfor -%}" +
                                    "</ ul > ";
            Template preparedTemplate = Template.Parse(template);
    
            var user = new User
            {
                Name = "Tim Jones",
                Tasks = new List<Task>
                {
                    new Task { Name = "Documentation" },
                    new Task { Name = "Code comments" }
                }
            };
            Template.RegisterSafeType(typeof(Task), new []{"Name"});
            Console.WriteLine(preparedTemplate.Render(DotLiquid.Hash.FromAnonymousObject(new { tempuser = user })));
    

    【讨论】:

    • 如果我按照您的建议更改模板,则会收到如下错误

      液体错误:“用户”类型的对象无法转换为“System.String”类型。必须做的:

      • 我已经添加了整个 Main 方法。此外,您在注册Task 类型以正确打印任务名称时遇到问题。
      • 我认为您将 {{ user.name | upcase }} 替换为 {{ tempuser | upcase }} 会出现错误,请将其更改为 {{ tempuser.name | upcase }}
      • 不,我没有改变这种方式。它和你解释的一样,但仍然是相同的错误 const string template = "

        {{ tempuser .name | upcase }} 必须这样做:" + "{% for item in tempuser .tasks -%}" + "{ { item.name } } li >" + "{% endfor -%}" + "";这是您建议的我当前的模板

      • 对不起,是的,删除了空间得到了正确的输出。非常感谢您的宝贵时间。所以,我标记已解决
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2021-08-26
      • 1970-01-01
      相关资源
      最近更新 更多