我正在研究HtmlHelper.AnonymousObjectToHtmlAttributes
。
它适用于匿名对象:
var test = new {@class = "aaa", placeholder = "bbb"};
var parseTest= HtmlHelper.AnonymousObjectToHtmlAttributes(test);
结果parseTest
有两个键值对。
但对于Dictionary
对象:
var attrsInDict = new Dictionary<string,object>() {
{"class", "form-control"},
{"placeholder", "Select one..."}
};
var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(attrsInDict );
获得的attrs
是一个奇怪的对象,有4个键和4个值。 4个键是 Comparer , Count ,键,值。
其他一些SO帖子询问两者之间的区别(here)。选定的答案说
没有太大的区别......
真的?什么是解析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);
}
}
答案 0 :(得分:4)
结果并不奇怪 - 它们正是我所期望的名为AnonymousObjectToHtmlAttributes
的方法。该方法需要输入test
,一个实际的匿名对象,而不是像Dictionary
这样的具体类的实例。
在传递Dictionary
实例的情况下,您看到的是它的公共属性,它们确实是Comparer
,Count
,Keys
和{ {1}}属性。
Values
的返回类型为AnonymousObjectToHtmlAttributes
。该类有一个接受RouteValueDictionary
的构造函数重载。
要正确使用字典,请执行以下操作:
IDictionary<string, object>
答案 1 :(得分:0)
Comparer,Count,Keys和Values是类Dictionary的公共属性。所以你得到的正是你要求的。如果你想要实际的键值对,你需要迭代字典。
答案 2 :(得分:0)
AnonymousObjectToHtmlAttributes
方法最有可能使用反射来迭代所提供类型的公共属性。如documentation所示,除了索引器之外,唯一的属性是Comparer
,Count
,Keys
和Values
。