Как я могу превратить анонимный объект в пары ключ / значение или атрибуты HTML? - PullRequest
4 голосов
/ 29 февраля 2012

В моем приложении MVC у меня есть вспомогательный класс, предназначенный для отображения группы связанных кнопок. Я пытаюсь передать атрибуты HTML кнопок как анонимный объект:

new { @class="myClass1 myClass2" }

Помощник генерирует HTML как MvcHtmlString, который я сейчас создаю следующим образом:

        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 объект и разобрать результат, но это выглядит довольно глупо. Как программно преобразовать анонимный объект в атрибуты HTML в стиле key="value"? Существует ли для этого существующая утилита?

Ответы [ 2 ]

14 голосов
/ 29 февраля 2012

Вам следует использовать класс TagBuilder, который создает для вас HTML-теги.

Вы можете написать

builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(HtmlAttributes));
3 голосов
/ 29 февраля 2012

Как оказалось, для класса 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 и получил примерно такое же количество кода.


Редактировать: Как указывал Слакс, такое поведение является потенциальной уязвимостью XSS. В моем конкретном случае использования не было никакого риска, но TagBuilder кажется наилучшей практикой.

...