Подтвердить что ты не робот

Зачем использовать TagBuilder вместо StringBuilder?

Какая разница в использовании конструктора тегов и построителя строк для создания таблицы в классе htmlhelper или с использованием HtmlTable?

они не генерируют одно и то же?

4b9b3361

Ответ 1

TagBuilder - это класс, специально предназначенный для создания тегов html и их содержимого. Вы правильно говорите, что результат будет в любом случае строкой, и, конечно, вы все равно можете использовать StringBuilder, и результат будет таким же, но вы можете сделать что-то проще с помощью TagBuilder. Допустим, вам нужно сгенерировать тег:

<a href='http://www.stackoverflow.com' class='coolLink'/>

Используя StringBuilder, вам нужно написать что-то вроде этого:

var sb = new StringBuilder();
sb.Append("<a href='");
sb.Append(link);
sb.Append("' class = '");
sb.Append(ccsClass);
sb.Append("'/>");
sb.ToString();

Это не очень здорово, не так ли? И сравните, как вы можете его построить, используя TagBuilder;

var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);

Разве это не лучше?

Ответ 2

Это просто удобство. Из этот учебник:

Вам действительно не нужно использовать класс TagBuilder. Вы можете использовать класс StringBuilder вместо. Однако класс TagBuilder делает вашу жизнь немного легче.

Посмотрите на методы на TagBuilder и подумайте, дают ли они вам ценность. хотите ли вы делать то же самое вручную вручную в StringBuilder каждый раз? Есть ли побег, что он делает для вас? Слияние атрибутов и т.д.? Является ли полученный код более легким для чтения, тем более ясно, что вы создаете тег, а не какую-то произвольную строку?

Ответ 3

Там, что другие ответы пропустили до сих пор. Если вы возвращаете TagBuilder из метода расширения, вы можете продолжать добавлять атрибуты в свой вид. Скажем, вы возвращаете таблицу из помощника Html, и вы хотите добавить атрибут класса. Если вы используете StringBuilder, вам нужно передать класс в качестве параметра.

public static string Table(...., string @class)
{
    ...
    sb.AppendFormat("class='{0}", @class);
    ...
}

// In the view
<%: Html.Table(someParams, "fancy") %>

Но добавление атрибута класса в тег HTML не относится к метода расширения, который создает таблицу! Если мы перейдем к семантической модели (TagBuilder) для генерации HTML, мы можем добавить атрибут class вне метода таблицы.

public static TagBuilder Table(....)
{
    ...
    return tag;
}

// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>

В дополнение к TagBuilder вы можете проверить библиотеку FubuMVC HtmlTags. Это гораздо лучшая модель для генерации HTML. У меня есть подробнее в блоге.

Ответ 4

они не генерируют одно и то же?

Ну, конечно, но это не должно быть сдерживающим фактором, не так ли? Один класс предназначен для чего-то более конкретного, чем другой, поэтому он предлагает более высокий уровень удобства.

Я мог бы спросить: зачем использовать StringBuilder? Почему бы не a List<char>? Не могу ли я создать одно и то же из:?

Идем дальше: почему даже List<char>? Почему не просто char[], изменение размера/манипуляции, которым я могу управлять собой? Я все еще могу полностью создать string из char[].

На самом деле мне действительно нужно char* и int (для длины). Правильно?

Моя точка зрения заключается в том, что если класс доступен для специальных функций, которые вы можете использовать, имеет смысл использовать его, если вы спросите меня.

Ответ 5

Как упоминается в других сообщениях, TagBuilder приносит некоторые удобства. Но вы должны учитывать, что TagBuilder и StringBuilder могут не давать одинаковый результат. TagBuilder применяет html-кодировку, но StringBuilder этого не делает. Таким образом, безопаснее использовать TagBuilder для преодоления уязвимостей, которые могут быть использованы при атаке XSS.

Ответ 6

Не забудьте сделать HTML-кодирование значений, если вы используете StringBuilder. Я надеюсь, что TagBuilder сделает это автоматически.