Зачем использовать 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 сделает это автоматически.