2016-05-02 8 views
1

Ich arbeitete an HtmlHelper.AnonymousObjectToHtmlAttributes.Wie analysiert man korrekt Dictionary <string, object> in

Es funktioniert gut mit anonymen Objekt:

var test = new {@class = "aaa", placeholder = "bbb"}; 
var parseTest= HtmlHelper.AnonymousObjectToHtmlAttributes(test); 

Das Ergebnis parseTest hat zwei Schlüssel-Wert-Paare.

Aber für Dictionary Objekt:

var attrsInDict = new Dictionary<string,object>() {    
    {"class", "form-control"}, 
    {"placeholder", "Select one..."} 
}; 
var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(attrsInDict); 

Die attrs ein seltsames Objekt erhalten wird, mit 4 Tasten und 4 Werte. Die 4 Tasten sind Comparer, Count, Schlüssel, Werte.

Einige andere SO Post fragen über den Unterschied zwischen den beiden (here). Die gewählte Antwort sagt

Es ist nicht allzu viel Unterschied ...

Wirklich? Und was ist der richtige Weg, die attrsInDict zu parsen und das gleiche Ergebnis zu erhalten, wie wir es von einem anonymen Objekt bekommen?

Für will ich attribues im folgenden Code fusionieren:

var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
foreach (var item in attrs) 
{ 
    if (attr.ContainsKey(item.Key)) 
    { 
     attr[item.Key] = $"{attr[item.Key]} {item.Value}"; 
    } 
    else 
    { 
     attr.Add(item.Key, item.Value); 
    } 
} 

Antwort

4

Die Ergebnisse sind nicht seltsam - sie sind genau das, was ich von einem Verfahren AnonymousObjectToHtmlAttributes genannt erwarten würde. Die Methode erwartet eine Eingabe wie test, ein tatsächliches anonymes Objekt, keine Instanz einer konkreten Klasse wie Dictionary.

Was Sie im Fall der Übergeben einer Instanz Dictionary sind seine öffentlichen Eigenschaften sind zu sehen, die sind in der Tat die Comparer, Count, Keys und Values Eigenschaften.

Der Rückgabetyp AnonymousObjectToHtmlAttributes ist RouteValueDictionary. Diese Klasse hat eine Konstruktorüberladung, die eine IDictionary<string, object> akzeptiert.

korrekt Ihr Wörterbuch zu verwenden, dies zu tun:

var attrs = new RouteValueDictionary(attrsInDict); 
+0

Ich sehe keinen Unterschied zwischen 'new RouteValueDictionary (attrsInDict);' und 'HtmlHelper.AnonymousObjectToHtmlAttributes (attrsInDict);'. Beide lieferten dasselbe Ergebnis. Alles was ich verpasst habe? – Blaise

+0

@Blaise: Diese beiden Beispiele sind nicht gleich; Sie sollten keine Wörterbuchinstanz in die 'HtmlHelper'-Methode übergeben - nur anonyme Objekte.Um das gleiche Ergebnis von einem anonymen Objekt und einer Dictionary-Instanz zu erhalten, müssen Sie die zwei verschiedenen Ansätze verwenden. –

0

Comparer, Graf, Schlüssel und Werte sind öffentliche Eigenschaften der Klasse Dictionary. So bekommen Sie genau das, was Sie verlangen. Wenn Sie tatsächliche Schlüssel/Wert-Paare haben möchten, müssen Sie über das Dictionary iterieren.

0

AnonymousObjectToHtmlAttributes Methode höchstwahrscheinlich verwendet Reflexion zur Iteration durch öffentliche Eigenschaften des bereitgestellten Typs. Wie in ihrer documentation zu sehen ist, sind die einzigen Eigenschaften neben dem Indexer Comparer, Count, Keys und Values.

Verwandte Themen