如何将匿名对象转换为键/值对或HTML属性
本文关键字:属性 HTML 转换 对象 | 更新日期: 2023-09-27 18:26:06
在我的MVC应用程序中,我有一个助手类,用于呈现一组相关按钮。我试图将按钮的HTML属性作为匿名对象传递:
new { @class="myClass1 myClass2" }
助手以MvcHtmlString
的形式发出HTML,我目前正在这样构建:
foreach (var b in _buttons)
{
sb.AppendFormat("<button type='submit' name='{0}' {1}>{2}</button>",
b.Value,
b.HtmlAttributes,
b.Text);
}
我的问题是上面的代码产生了无效的HTML:
<button type='submit' name='Foo' { class = myClass1 myClass2 }>Bar</button>
不幸的是,由于它是作为object
传递给助手的,所以我没有类型信息可以使用。我可以ToString
对象并解析结果,但这看起来很傻。如何以编程方式将匿名对象转换为key="value"
样式的HTML属性?是否有现有的实用程序?
您应该使用TagBuilder
类,它为您构建HTML标记。
然后你可以写
builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(HtmlAttributes));
事实证明,在HtmlHelper
类上有一个静态方法:
HtmlHelper.AnonymousObjectToHtmlAttributes(b.HtmlAttributes)
这解决了我的问题:
foreach (var b in _buttons)
{
var dict = HtmlHelper.AnonymousObjectToHtmlAttributes(b.HtmlAttributes);
var attr = dict.Keys.Zip(
dict.Values,
(k, v) => string.Format("{0}='{1}'", k, v));
sb.AppendFormat("<button type='submit' name='{0}' {1}>{2}</button>",
b.Value,
string.Join(" ", attr),
b.Text);
}
我还用TagBuilder进行了尝试,得到了大约相同数量的代码。
编辑:正如Slaks所指出的,这样做是一个潜在的XSS漏洞。在我的特定用例中没有风险,但TagBuilder似乎是最佳实践。