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

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

разве они не генерирующий то же самое??

40
задан DaveDev 15 June 2010 в 08:35
поделиться

5 ответов

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

Разве не лучше?

63
ответ дан 27 November 2019 в 01:19
поделиться

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

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

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

.
16
ответ дан 27 November 2019 в 01:19
поделиться

Есть момент, который пока упускают другие ответы. Если вы вернете 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 вы можете попробовать библиотеку HtmlTags FubuMVC. Это гораздо лучшая модель для создания HTML. У меня есть дополнительная информация в блоге.

12
ответ дан 27 November 2019 в 01:19
поделиться

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

0
ответ дан 27 November 2019 в 01:19
поделиться

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

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

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

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

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

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

8
ответ дан 27 November 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: