28

TagBuilder 是构建 HTML 元素的一个很好的实现。但是 -some- HTML 元素可以有其他元素(我称之为子元素)。我在 Mvc 类中找不到任何类。

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

4

3 回答 3

47

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

这是一个例子:A<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();
}
于 2011-02-10T15:01:25.487 回答
6

好的,我决定在我自己的代码库中做一个小测试。

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

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

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

使用多个 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 的结构。

于 2012-12-12T21:29:44.160 回答
-1

我使用 TagBuilder 创建标签的问题是它看起来非常难以维护。另一方面,StringBuilder 的 AppendFormat 不仅使代码可维护,而且运行效率也很高。

我对 MattSlay 的 #1 方法做了些许改进。我只使用了一次对 StringBuilder 的 AppendFormat 方法的调用,并使用 C# 字符串文字来定义格式。结果,格式最终看起来与期望的结果完全一样,并且运行效率很高。

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

希望这可以帮助!

于 2013-08-13T12:43:36.540 回答