嵌套TagBuilder -as TagBuilderTree-

Nur*_*MAZ 26 asp.net-mvc tagbuilder razor

TagBuilder是构建HTML元素的一个很好的实现.但是-some-HTML元素可以有另一个元素(我称之为子元素).我找不到Mvc课程的任何课程.

题; 我应该实现几个支持嵌套标签的类(TagBuilderTree和TagBuilderNode),还是我错过了什么?

SLa*_*aks 45

您可以在单独的TagBuilders中构建子元素,并将其生成的HTML放在父TagBuilder中.

这是一个例子:<select>带有一些<option>s的例子(例如为了简洁而减肥)

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用XElement. (2认同)

Mat*_*lay 5

好的,我决定在自己的代码库中进行一些测试。

我比较了这两种方法来创建相同的最终HTML:

  1. 使用StringBuilder手动生成html
  2. 使用多个TagBuilder并嵌套内容

使用StringBuilder手动生成html:


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

使用多个TagBuilder并合并内容:


    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());
Run Code Online (Sandbox Code Playgroud)

对我来说,#1更容易阅读,也更简洁,但我也可以欣赏#2的结构。

  • 我认为#1更容易出错,因为它依赖于正确键入带有正确的结束标记,单引号,双引号等位置的HTML。加上TagBuilder具有更多的intellisense。例如,当添加CSS类时,stringbuilder将不会提供任何智能感知来添加类,而TagBulder具有具有智能感知的AddCSSClass方法。我也发现#2更具可读性。方法1中的所有占位符使事情变得不太清楚。 (2认同)