Какая разница в использовании конструктора тегов и построителя строк для создания таблицы в классе htmlhelper или с использованием HtmlTable?
они не генерируют одно и то же?
Какая разница в использовании конструктора тегов и построителя строк для создания таблицы в классе htmlhelper или с использованием HtmlTable?
они не генерируют одно и то же?
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);
Разве это не лучше?
Это просто удобство. Из этот учебник:
Вам действительно не нужно использовать класс 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, мы можем добавить атрибут class вне метода таблицы.
public static TagBuilder Table(....)
{
...
return tag;
}
// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
В дополнение к TagBuilder вы можете проверить библиотеку FubuMVC HtmlTags. Это гораздо лучшая модель для генерации HTML. У меня есть подробнее в блоге.
они не генерируют одно и то же?
Ну, конечно, но это не должно быть сдерживающим фактором, не так ли? Один класс предназначен для чего-то более конкретного, чем другой, поэтому он предлагает более высокий уровень удобства.
Я мог бы спросить: зачем использовать StringBuilder
? Почему бы не a List<char>
? Не могу ли я создать одно и то же из:?
Идем дальше: почему даже List<char>
? Почему не просто char[]
, изменение размера/манипуляции, которым я могу управлять собой? Я все еще могу полностью создать string
из char[]
.
На самом деле мне действительно нужно char*
и int
(для длины). Правильно?
Моя точка зрения заключается в том, что если класс доступен для специальных функций, которые вы можете использовать, имеет смысл использовать его, если вы спросите меня.
Как упоминается в других сообщениях, TagBuilder приносит некоторые удобства. Но вы должны учитывать, что TagBuilder и StringBuilder могут не давать одинаковый результат. TagBuilder применяет html-кодировку, но StringBuilder этого не делает. Таким образом, безопаснее использовать TagBuilder для преодоления уязвимостей, которые могут быть использованы при атаке XSS.
Не забудьте сделать HTML-кодирование значений, если вы используете StringBuilder. Я надеюсь, что TagBuilder сделает это автоматически.