2016-04-12 16 views
0

Soweit ich know, unterstützt DotLiquid (mit Version 1.8.0.0) nicht C# Dictionary Konstrukte aus der Box. Sie müssen in einem Drop -Objekt verpackt sein.DotLiquid: Schleife durch ein (Wrapped) Dictionary <string, string> in for-loop in Vorlage

Also habe ich versucht, die Antwort von Tim Jones für meinen Anwendungsfall anzupassen. Leider funktioniert das nicht wie erwartet, also hoffe ich, dass mir jemand zeigen könnte, wo ich hier falsch liege, denn ich habe keine Ideen mehr.

Dies ist (einer) Klasse mein wickelte Modell ein Wörterbuch enthält:

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

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

Die Klasse selbst in einem LegendModel enthält einige andere Werte eingebettet ist:

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

Wie Sie sehen können, Alle Klassen sind in eine Drop verpackt, die, wie ich weiß, Voraussetzung für die Verwendung von Dictionaries (ILiquidizable implementieren usw.) ist.

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

Und in einer Klasse ConvertToPdf, ich habe eine ConvertTemplate Methode wie diese, die Vorlage Parsen:

In einem Konverter wird dieses Modell wie folgt gefüllt

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

Und schließlich in Meine Templatefile, ich versuche, die Werte dieses Wörterbuchs wie folgt zu erhalten:

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

Nun wird die Datei korrekt parsen, aber alles, was ich jetzt bekommen, ist diese Ausgabe, wenn ich versuche, die Dictionaryvalues ​​in meiner Schleife zuzugreifen:

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

Nun scheint es, dass ich tatsächlich die richtigen Werte in meiner Vorlage erhalten .Parse-Methode. Ich bringe sie nur nicht aus meiner Struktur heraus, weil ...? Jede Hilfe wird geschätzt. Um ehrlich zu sein, ich denke hier fehlt mir etwas grundlegend.

Antwort

1

Das Problem ist, dass KeyValuePair<T>, mit dem Sie die Key und Value Eigenschaften zugreifen möchten, ist weder ein Drop noch implementiert ILiquidizable.

Wenn Sie die Elemente in Ihrem Wörterbuch so durchlaufen möchten, müssen Sie einen KeyValueDrop Wrapper erstellen und einen List davon anstelle eines Wörterbuchs verfügbar machen.