Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将匿名对象转换为键/值对或HTML属性?_C#_Asp.net Mvc 3_Anonymous Types_Html - Fatal编程技术网

C# 如何将匿名对象转换为键/值对或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}

在我的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);
        }
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。