为什么使用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自动执行此操作。