如何将匿名对象转换为键/值对或HTML属性?

时间:2012-02-29 17:49:12

标签: 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}</button>",
                b.Value,
                b.HtmlAttributes,
                b.Text);
        }

我的问题是上面的代码产生了无效的HTML:

<button type='submit' name='Foo' { class = myClass1 myClass2 }>Bar</button>

不幸的是,由于它已作为object传递给帮助者,因此我没有类型信息可供使用。我可以ToString对象并解析结果,但这看起来很傻。如何以编程方式将匿名对象转换为key="value"样式的HTML属性?是否有现有的实用程序?

2 个答案:

答案 0 :(得分:14)

您应该使用TagBuilder类,为您构建HTML标记。

然后你可以写

builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(HtmlAttributes));

答案 1 :(得分:3)

事实证明,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似乎是最好的做法。