Зачем использовать TagBuilder вместо StringBuilder? - PullRequest
40 голосов
/ 15 июня 2010

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

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

Ответы [ 6 ]

63 голосов
/ 15 июня 2010

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);

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

16 голосов
/ 15 июня 2010

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

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

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

12 голосов
/ 15 июня 2010

Есть момент, который другие ответы пропустили до сих пор. Если вы вернете 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. У меня есть более подробная информация в блоге.

8 голосов
/ 15 июня 2010

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

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

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

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

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

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

1 голос
/ 25 января 2015

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

0 голосов
/ 15 июня 2010

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

...