Проблема вывода примера механизма шаблонов DotLiquid

Я пытаюсь использовать пример из 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 >

person user2911592    schedule 10.06.2020    source источник


Ответы (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 })));
person Irdis    schedule 10.06.2020
comment
если я изменю шаблон, как вы предложили, я получаю сообщение об ошибке, как показано ниже ‹p›Liquid error: объект типа «Пользователь» не может быть преобразован в тип «System.String». должен сделать:‹/p›‹ ул ›‹/ ул › - person user2911592; 10.06.2020
comment
Я добавил весь метод Main. Также у вас есть проблема с регистрацией типа Task для правильной печати имени задачи. - person Irdis; 10.06.2020
comment
Я думаю, что вы заменили {{ user.name | upcase }} на {{ tempuser | upcase }}, что дает вам ошибку, измените его на {{ tempuser.name | upcase }} - person Irdis; 10.06.2020
comment
Нет, я не изменил этот путь. Это то же самое, что вы объяснили, но все та же ошибка const string template = ‹p›{{ tempuser .name | upcase }} должен сделать:‹/p› + ‹ ul ›{% для элемента в tempuser .tasks -%} + ‹ li ›{ { item.name } }‹/ li › + {% endfor -%} + ‹ / ул › ; Это мой текущий шаблон, как вы предложили - person user2911592; 10.06.2020
comment
у вас есть пробел tempuser .tasks и tempuser .name | upcase перед точкой - person Irdis; 10.06.2020
comment
Извините, да, убрал пробел, вывод правильный. Большое спасибо за ваше время. Итак, я отмечаю, что решено - person user2911592; 10.06.2020