2

DotLiquid テンプレートで IEnumerable をループすると

{% for block in Blocks -%}

    // this works
    {{ block.Structure }}

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

{% endfor -%} 

メンバーを直接レンダリングできますblock.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.RenderContext変数名を変数に解決するインデクサーがあります。(そして、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 に答える