为什么使用TagBuilder而不是StringBuilder?

Dav*_*Dev 40 c# asp.net-mvc stringbuilder extension-methods tagbuilder

使用标记生成器和字符串生成器在htmlhelper类中创建表或使用HtmlTable有什么区别?

他们不是生成同样的事情吗?

Bas*_*dov 63

TagBuilder是专门为创建HTML标记及其内容而设计的类.你是对的,结果将是一个字符串,当然你仍然可以使用StringBuilder,结果将是相同的,但你可以做更容易的事情TagBuilder.让我们说你需要生成一个标签:

<a href='http://www.stackoverflow.com' class='coolLink'/>
Run Code Online (Sandbox Code Playgroud)

使用StringBuilder你需要写这样的东西:

var sb = new StringBuilder();
sb.Append("<a href='");
sb.Append(link);
sb.Append("' class = '");
sb.Append(ccsClass);
sb.Append("'/>");
sb.ToString();
Run Code Online (Sandbox Code Playgroud)

它不是很酷,不是吗?并比较如何使用它来构建它TagBuilder;

var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);
Run Code Online (Sandbox Code Playgroud)

那不是更好吗?

  • 对于上面的简单标签,我更喜欢`sb.AppendFormat("<a href='{0}'class ='{1}'/>",link,cssClass);`但是如果有的话,TagBuilder上的方法真的很整洁需要更复杂的标签. (12认同)
  • “ &lt;a href='"+链接+"'class='" + class + "'/&gt;”更干净。它之所以快,是因为1)字符串连接非常快,最终结果还是单个字符串,并且2)不会过早优化。对于更复杂的情况(例如表),我建议使用像Spark这样的模板引擎。我见过使用TagBuilder的资源,但仍然很难理解。 (2认同)

Jon*_*eet 16

这只是方便.从本教程:

您实际上不需要使用TagBuilder类.您可以使用StringBuilder类.但是,TagBuilder类让您的生活更轻松.

查看TagBuilder上的方法,并考虑它们是否为您提供了价值.你想StringBuilder每次都手动做同样的事情吗?有没有逃脱它为你做的?属性合并等?结果代码是否更易于阅读,使您更清楚地构建标记而不是某些任意字符串?

  • @Joel Rodgers TagBuilder在"HtmlHelpers"中占有一席之地 (9认同)

Rya*_*yan 12

到目前为止,其他答案已经错过了一点.如果TagBuilder从扩展方法返回,则可以继续在视图中添加属性.假设您从Html帮助器返回一个表,并且您想要添加一个类属性.如果您正在使用a StringBuilder,则需要将该类作为参数传递.

public static string Table(...., string @class)
{
    ...
    sb.AppendFormat("class='{0}", @class);
    ...
}

// In the view
<%: Html.Table(someParams, "fancy") %>
Run Code Online (Sandbox Code Playgroud)

但是,为HTML标记添加类属性不是创建表的扩展方法的关注点!如果我们切换到用于生成HTML的语义模型(TagBuilder),我们可以在table方法之外添加class属性.

public static TagBuilder Table(....)
{
    ...
    return tag;
}

// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
Run Code Online (Sandbox Code Playgroud)

除了TagBuilder之外,您可能还想查看FubuMVC的HtmlTags库.这是一个更好的生成HTML的模型.我在博客上有更多细节.


Dan*_*Tao 8

他们不是生成同样的事情吗?

嗯,当然,但这应该不是一种威慑力,不是吗?一个类是针对比另一个更具体的东西而设计的,因此它提供了更大的便利性.

我可以问:为什么要使用StringBuilder?为什么不List<char>呢?我不能从两者中产生同样的东西吗?

更进一步:为什么连一个List<char>?为什么不只是一个char[],我可以控制自己的调整大小/操纵?我仍然可以完全创建string一个char[].

事实上,我真正需要的是一个char*和一个int(长度).对?

我的观点是,如果一个类可用于您可以使用的专用功能,那么在您问我时使用它是有意义的.