为什么使用TagBuilder而不是StringBuilder?

使用标记生成器和string生成器在htmlhelper类中创build表或使用HtmlTable有什么区别?

他们是不是产生了同样的事情?

TagBuilder是一个专门为创buildhtml标签及其内容而devise的类。 你说得对,结果无论如何是一个string,当然你仍然可以使用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来构build它;

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

不是更好吗?

这只是方便。 从这个教程 :

你并不需要使用TagBuilder类。 你可以使用一个StringBuilder类。 但是,TagBuilder类让你的生活更轻松一些。

看一下TagBuilder上的方法,并考虑它们是否给你带来价值。 你想在StringBuilder每次手动做同样的事情吗? 它有逃脱吗? 属性合并等? 生成的代码是否易于阅读,使得您更清楚地构build标签而不是一些任意的string?

有一点,其他答案已经错过了迄今。 如果您从扩展方法返回TagBuilder ,则可以继续在视图中添加属性。 假设你从一个Html帮助器返回一个表,并且你想添加一个类属性。 如果您使用的是StringBuilder ,则需要将该类作为parameter passing。

 public static string Table(...., string @class) { ... sb.AppendFormat("class='{0}", @class); ... } // In the view <%: Html.Table(someParams, "fancy") %> 

但是为HTML标签添加类属性并不是创build表的扩展方法所关心的问题 ! 如果我们切换到一个语义模型(TagBuilder)来生成HTML,我们可以在table方法之外添加class属性。

 public static TagBuilder Table(....) { ... return tag; } // In the view <%: Html.Table(someParams).AddCssClass("fancy") %> 

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

他们是不是产生了同样的事情?

那么,当然,但这不应该是一个威慑,应该吗? 一类是为了比另一类更具体而devise的,所以它提供了更高水平的便利。

我可以问:为什么使用StringBuilder ? 为什么不是一个List<char> ? 我不能从任何一个产生相同的东西吗?

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

实际上,我真正需要的是char*int (长度)。 对?

我的意思是,如果一个类可用于您可以使用的专用function,如果您问我,则可以使用它。

正如其他文章中提到的,TagBuilder带来了一些便利。 但是你应该考虑到TagBuilder和StringBuilder可能不会产生相同的结果。 TagBuilder使用html编码,但是StringBuilder没有。 所以使用TagBuilder来克服可能通过XSS攻击被利用的漏洞更为安全。

如果您使用的是StringBuilder,请不要忘记对值进行HTML编码。 我希望TagBuilder自动执行此操作。