1

に取り組んでいましたHtmlHelper.AnonymousObjectToHtmlAttributes

匿名オブジェクトでうまく機能します:

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

結果parseTestには 2 つのキーと値のペアがあります。

しかし、Dictionaryオブジェクトの場合:

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

得られたのattrsは、4 つのキーと 4 つの値を持つ奇妙なオブジェクトです。4 つのキーはComparerCountKeysValuesです。

2つの違いについて尋ねる他のSO投稿(ここ)。選択された答えは言う

差がありすぎない…

本当に?attrsInDictそして、匿名オブジェクトから取得したものと同じ結果を解析して取得する正しい方法は何ですか?

次のコードで属性をマージするつもりです。

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

3 に答える 3

4

結果は奇妙ではありません。まさにAnonymousObjectToHtmlAttributes. testメソッドは、 のような具象クラスのインスタンスではなく、実際の匿名オブジェクトのような入力を期待しますDictionary

のインスタンスを渡す場合に表示されるのは、実際には、、、およびプロパティDictionaryであるそのパブリック プロパティです。ComparerCountKeysValues

の戻り値の型はAnonymousObjectToHtmlAttributesですRouteValueDictionary。そのクラスには、を受け入れるコンストラクターのオーバーロードがありますIDictionary<string, object>

辞書を正しく使用するには、次のようにします。

var attrs = new RouteValueDictionary(attrsInDict);
于 2016-05-02T20:39:09.953 に答える
0

AnonymousObjectToHtmlAttributesメソッドは、おそらくリフレクションを使用して、提供された型のパブリック プロパティを反復処理します。そのドキュメントに見られるように、インデクサー以外の唯一のプロパティは、、、Comparerおよびです。CountKeysValues

于 2016-05-02T20:44:57.327 に答える
0

Comparer、Count、Keys、および Values は、クラス Dictionary のパブリック プロパティです。したがって、あなたが要求しているものを正確に取得しています。実際のキーと値のペアが必要な場合は、Dictionary を反復処理する必要があります。

于 2016-05-02T20:40:42.933 に答える