2016-04-12 11 views
0

I knowまでは、DotLiquid(バージョン1.8.0.0を使用)はC#Dictionaryのコンストラクトをサポートしていません。 Drop -Objectにラップする必要があります。DotLiquid:テンプレート内のfor-loop内の(ラップされた)ディクショナリ<string、string>をループする

私はユースケースのためにティムジョーンズの答えを適応しようとしました。悲しいことに、これは期待どおりに動作していないので、誰かが私がここで間違っているところを見せてくれることを願っています。

これは、辞書を含む私のラップモデルクラス(の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 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; 
} 

とIn:テンプレートを解析し、

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; 
} 

をし、クラスConvertToPdfに、私はこのようなConvertTemplate方法があります。

コンバータで

、このモデルは次のように満たされています私のTemplatefile、私はこの辞書の値を得ようとします:

<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 

今では私が実際にが私のテンプレートで正しい値を取得するようです.Parseメソッド。私は彼らを私の構造から外しているわけではないから... ...?どんな助けもありがとうございます。正直言って、私はここで根本的に何かが欠けていると思う。

答えて

1

問題は、どちらもDropでもILiquidizableを実装あなたがKeyValueプロパティにアクセスしようとしているKeyValuePair<T>、ということです。

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

関連する問題