C# 如何将匿名对象转换为键/值对或HTML属性?
在我的MVC应用程序中,我有一个助手类,用于呈现一组相关按钮。我试图以匿名对象的形式传入按钮的HTML属性:C# 如何将匿名对象转换为键/值对或HTML属性?,c#,asp.net-mvc-3,anonymous-types,html,C#,Asp.net Mvc 3,Anonymous Types,Html,在我的MVC应用程序中,我有一个助手类,用于呈现一组相关按钮。我试图以匿名对象的形式传入按钮的HTML属性: new { @class="myClass1 myClass2" } 助手以MvcHtmlString的形式发出HTML,我目前正在这样构建它: foreach (var b in _buttons) { sb.AppendFormat("<button type='submit' name='{0}' {1}>{2}
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);
}
foreach(变量b在按钮中)
{
sb.AppendFormat(“{2}”,
b、 价值观,
b、 向您致敬,
b、 文本);
}
我的问题是上面的代码生成了无效的HTML:
<button type='submit' name='Foo' { class = myClass1 myClass2 }>Bar</button>
条
不幸的是,由于它是作为
对象
传递给帮助器的,所以我没有类型信息可以处理。我可以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);
}
foreach(变量b在按钮中)
{
var dict=HtmlHelper.AnonymousObjectToHtmlAttributes(b.HtmlAttributes);
var attr=dict.Keys.Zip(
名言价值观,
(k,v)=>string.Format(“{0}='{1}',k,v));
sb.AppendFormat(“{2}”,
b、 价值观,
string.Join(“,attr),
b、 文本);
}
我还尝试了一个标记生成器,得到了大约相同数量的代码
编辑:正如Slaks指出的那样,这样做是一个潜在的XSS漏洞。在我的特定用例中没有风险,但TagBuilder似乎是最佳实践。我在最终版本中没有使用TagBuilder,但感谢您让我知道它的存在+1.更新:这不是我使用的方法,但那是因为我的案例有点独特
TagBuilder
是最佳实践,所以我接受这个答案。ASP.NET web窗体是否有任何等效项?@RubensMariuzzo:您可以从WebForms项目中引用System.web.Mvc.dll
并使用该类。但是,您的版本存在XSS漏洞。使用TagBuilder
;不要重新发明轮子。@Slaks-我可以控制进入HTML的值,它们是一组有限的值,不是来自用户输入。不过,我认为这个答案在构建复杂组件时很有用,因为在这些组件中,您无法完全控制HTML。