2

当我在 DotLiquid 模板中循环一个 IEnumerable 时

{% for block in Blocks -%}

    // this works
    {{ block.Structure }}

    // this doesn't
    {% RenderObject block.Structure %}

{% endfor -%} 

我可以直接通过渲染成员,block.Structure但我不知道如何在我自己的标记类中访问此 Structure 对象RenderObject

public class RenderObject : Tag
{
    private string _tagName;
    private string _markup;

    public override void Initialize(string tagName, string markup, List<string> tokens)
    {
        _tagName = tagName;
        _markup = markup.Trim();
        base.Initialize(tagName, markup, tokens);
    }

    public override void Render(Context context, TextWriter result)
    {
        // HERE COMES THE QUESTION
        // How to access the block.Structure object here?
        var structure = ?
4

1 回答 1

4

您可以使用context传递给您的RenderObject.Render方法的对象。上面有一个索引器Context,可以将变量名解析为变量。(并且For标签将循环变量,即block在您的示例中,放入context.)

剩下的问题是获取变量名(“block.Structure”)。幸运的是,这正是markup传递给 的变量的RenderObject.Initialize用途。

所以这应该工作:

public class RenderObject : Tag
{
    private string _tagName;
    private string _markup;

    public override void Initialize(string tagName, string markup, List<string> tokens)
    {
        _tagName = tagName;
        _markup = markup.Trim();
        base.Initialize(tagName, markup, tokens);
    }

    public override void Render(Context context, TextWriter result)
    {
        var structure = context[_markup];
    }
}
于 2012-10-06T05:25:19.863 回答