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

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

aren't they generating the same thing??

6 ответов

Решение

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

<a href='http://www.stackru.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);

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

Это просто удобство. Из этого урока:

Вам действительно не нужно использовать класс TagBuilder. Вместо этого вы можете использовать класс StringBuilder. Тем не менее, класс TagBuilder делает вашу жизнь немного проще.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам