0

私の知る限り、DotLiquid (バージョン 1.8.0.0 を使用) はそのままでは C# 構造をサポートしていませんDictionaryDrop-Objectでラップする必要があります。

そこで、Tim Jones の Answer を自分のユースケースに適合させようとしました。悲しいことに、これは期待どおりに機能していません。アイデアが不足しているため、誰かがここで間違っている場所を教えてくれることを願っています。

これは、ディクショナリを含むラップされたモデル クラス (の 1 つ) です。

public class LegendAdditive : Drop
{
    public LegendAdditive() 
    {
        AdditiveDict = new Dictionary<string, string>();
    }

    public Dictionary<string, string> AdditiveDict { get; set; }
}

クラス自体は、LegendModel他の値を含むに埋め込まれています。

public class LegendModel: Drop
{
    ...
    public LegendAdditive Additives { get; set; }
    ...
}

ご覧のとおり、すべてのクラスは にラップされていますDrop。これは、私が知っているように、辞書を使用するための前提条件です (ILiquidizable の実装など)。

コンバーターでは、このモデルは次のように入力されます。

public DotLiquid.Drop GetModel(MyObject plan) 
{
    ...
    var LegendAdditives = new LegendAdditive();

    //dbLegend.Additives is a Dictionary<string, string> itself.
    if (dbLegend.Additives.Any())
        foreach (var additive in dbLegend.Additives.OrderBy(a => a.Key))
            LegendAdditives.AdditiveDict.Add(additive.Key, additive.Value);

   ...

    LegendModel model = new LegendModel
    {
        ...
        Additives = LegendAdditives,
        ...
    };

    return model; 
}

classConvertToPdfにはConvertTemplate、テンプレートを解析する次のようなメソッドがあります。

public static string ConvertTemplate(ITemplateFileFactory templateFilePathFactory IDropModelConverter modelConverter, MyObject mplan)
{
    //reading my filepath out of the factory here...

    DotLiquid.Template.NamingConvention = new DotLiquid.NamingConventions.CSharpNamingConvention();

    Template templateObj = Template.Parse(template);  // Parses and compiles the template
    Drop plan = modelConverter.GetModel(mplan);
    Hash hashedValues = Hash.FromAnonymousObject(new { plan });
    string ret = templateObj.Render(hashedValues);
    return ret;
}

そして最後に、テンプレートファイルで、このディクショナリの値を次のように取得しようとします:

<div>
    <dl>
        {% for add in plan.Additives.AdditiveDict %}
        <dt>{{add.Key}}</dt>
        <dd>{{add.Value}}</dd>
        {% endfor %}
    </dl>
</div>

これで、ファイルは正しく解析されますが、ループ内で Dictionaryvalues にアクセスしようとしたときに得られるのは、次の出力だけです。

Liquid syntax error: Object '[18, Stärke]' is
invalid because it is neither a built-in type
nor implements ILiquidizable

Template.Parse メソッドで実際に正しい値を取得しているようです。私は彼らを私の構造から追い出していないだけです.なぜなら...?どんな助けでも大歓迎です。正直なところ、ここでは根本的に何かが欠けていると思います。

4

1 に答える 1

1

問題は、とのプロパティKeyValuePair<T>にアクセスしようとしているが、も implements でもないことです。KeyValueDropILiquidizable

そのように辞書内のアイテムをループしたい場合は、KeyValueDropラッパーを作成しList、辞書の代わりにそのアイテムを公開する必要があります。

于 2016-04-12T15:46:07.710 に答える