Вложенный TagBuilder - в TagBuilderTree-
TagBuilder - хорошая реализация для создания HTML-элементов. Но-some-HTML-элементы могут иметь другие элементы (я называл их как дети). Я не мог найти класс из классов Mvc.
Вопрос; Должен ли я реализовать несколько классов (TagBuilderTree и TagBuilderNode), которые поддерживают вложенные теги или я что-то пропустил?
Ответы
Ответ 1
Вы можете создать дочерние элементы в отдельных TagBuilders и поместить их сгенерированный HTML в родительский TagBuilder.
Вот пример: A <select>
с некоторым <option>
(например, обезжиренный для склеивания)
TagBuilder select = new TagBuilder("select");
foreach (var language in languages) // never ye mind about languages
{
TagBuilder option = new TagBuilder("option");
option.MergeAttribute("value", language.ID.ToString());
if (language.IsCurrent)
{
option.MergeAttribute("selected", "selected");
}
option.InnerHtml = language.Description;
// And now, the money-code:
select.InnerHtml += option.ToString();
}
Ответ 2
ОК, я решил сделать небольшой тест в своей собственной базе кода.
Я сравнил эти два метода, чтобы создать тот же самый окончательный HTML:
- Вручную создаем html с помощью StringBuilder
- Использование нескольких TagBuilders и вложенность содержимого
Вручную создаем html с помощью StringBuilder:
var sb = new StringBuilder();
sb.AppendLine("<div class='control-group'>");
sb.AppendFormat(" <label class='control-label' for='{0}_{1}'>{2}</label>", propObj.ModelType, propObj.ModelProperty, propObj.LabelCaption);
sb.AppendLine(" <div class='controls'>");
sb.AppendFormat(" <input id='{0}_{1}' name='{0}[{1}]' value='{2}' />", propObj.ModelType, propObj.ModelProperty, propObj.PropertyValue);
sb.AppendLine(" </div>");
sb.AppendLine("</div>");
return new HtmlString(sb.ToString());
Использование нескольких TagBuilders и объединение содержимого:
TagBuilder controlGroup = new TagBuilder("div");
controlGroup.AddCssClass("control-group");
TagBuilder label = new TagBuilder("label");
label.AddCssClass("control-label");
label.InnerHtml = propObj.LabelCaption;
TagBuilder controls = new TagBuilder("div");
TagBuilder input = new TagBuilder("input");
input.Attributes["id"] = propObj.ModelType + "_" + propObj.ModelProperty;
input.Attributes["name"] = propObj.ModelType + "[" + propObj.ModelProperty + "]";
input.Attributes["value"] = propObj.PropertyValue;
controls.InnerHtml += input;
controlGroup.InnerHtml += label;
controlGroup.InnerHtml += controls;
return new HtmlString(controlGroup.ToString());
Мне, № 1 легче читать и гораздо более кратким, но я также могу оценить структуру # 2.
Ответ 3
Проблема с тем, что у меня есть TagBuilder для создания тегов, заключается в том, что он выглядит очень незащищенным. С другой стороны, StringBuilder AppendFormat не только делает код поддерживаемым, но и работает с хорошей эффективностью.
Я немного улучшил метод MattSlay # 1. Я использовал только один вызов метода StringBuilder AppendFormat и использовал строковый литерал С# для определения формата. В результате формат заканчивается таким же, как и желаемый результат, и работает с эффективностью.
var sb = new StringBuilder();
sb.AppendFormat(
@"<div class='control-group'>
<label class='control-label' for='{0}_{1}'>{2}</label>
<div class='controls'>
<input id='{0}_{1}' name='{0}[{1}]' value='{3}' />
</div>
</div>",
propObj.ModelType,
propObj.ModelProperty,
propObj.LabelCaption,
propObj.PropertyValue);
return new HtmlString(sb.ToString());
Надеюсь, это поможет!