1

我正在研究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 个 Keys 和 4 个 Values。这 4 个键是ComparerCountKeysValues

其他一些 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属性。

的返回类型AnonymousObjectToHtmlAttributesRouteValueDictionary。该类有一个构造函数重载,它接受一个IDictionary<string, object>.

要正确使用您的字典,请执行以下操作:

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

Comparer、Count、Keys 和 Values 是 Dictionary 类的公共属性。所以你得到的正是你所要求的。如果您想要实际的键值对,则需要遍历 Dictionary。

于 2016-05-02T20:40:42.933 回答
0

AnonymousObjectToHtmlAttributes方法很可能使用反射来遍历所提供类型的公共属性。从其文档中可以看出,除了索引器之外,唯一的属性是Comparer、和。CountKeysValues

于 2016-05-02T20:44:57.327 回答