回答
TagBuilder
是专门为创建html标签及其内容而设计的类。你说得对,结果无论如何都是一个字符串,当然你仍然可以使用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
来构建它;
var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);
不是更好吗?
这只是方便。从this tutorial:
你并不需要使用TagBuilder类。 您可以改为使用StringBuilder类 。但是,TagBuilder类 让您的生活变得更轻松。
看看TagBuilder上的方法,并考虑它们是否给你带来价值。您是否想每次都手动在StringBuilder
中执行相同的操作?它有逃脱,它为你做?属性合并等?结果代码是否易于阅读,使得您更清楚地构建标签而不是一些任意字符串?
我认为使用TagBuilder打败了MVC的目的。为简洁起见,您将代码和标记混合在一起,代价是更易于修改。 – 2012-05-23 19:42:07
@Joel Rodgers TagBuilder在'HtmlHelpers'中占据了一席之地 – 2012-11-06 07:48:15
还有一点你会对标签生成器感到愤怒,并在你主要重用标签生成器的地方实现自己的目标。 – 2014-10-08 17:53:55
他们是不是产生同样的东西?
那么,当然,但这不应该是一种威慑,应该呢?一门课是为比其他课程更具体的课程而设计的,所以它提供了更高的便利性。
我可以问:为什么要用StringBuilder
?为什么不是List<char>
?我不能从两者产生相同的东西吗?
更进一步:为什么即使是一个List<char>
?为什么不只是一个char[]
,我可以控制自己的大小/操纵?我仍然可以从char[]
完全创建一个string
。其实,我真正需要的是char*
和int
(长度)。对?
我的观点是,如果一个类可用于您可以使用的专用功能,如果您问我,则使用它是有意义的。
如果您使用的是StringBuilder,不要忘记对值进行HTML编码。我希望TagBuilder自动执行此操作。
SetInnerText将对字符串进行编码。 – SwampyFox 2013-02-28 21:03:34
有一点,其他答案已经错过了迄今。如果您从扩展方法返回TagBuilder
,则可以继续在视图中添加属性。假设您从Html助手中返回一个表,并且您想添加一个类属性。如果您使用的是StringBuilder
,则需要将该类作为参数传入。
public static string Table(...., string @class)
{
...
sb.AppendFormat("class='{0}", @class);
...
}
// In the view
<%: Html.Table(someParams, "fancy") %>
但添加class属性的HTML标签是创建一个表扩展方法不关注!如果我们切换到一个用于生成HTML的语义模型(TagBuilder),我们可以在table方法之外添加class属性。
public static TagBuilder Table(....)
{
...
return tag;
}
// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
除了TagBuilder,你可能想看看FubuMVC的HtmlTags库。这是一个更好的模型来生成HTML。我在博客上有一些more details。
正如其他文章中提到的那样,TagBuilder带来了一些便利。 但是你应该考虑到TagBuilder和StringBuilder可能不会产生相同的结果。 TagBuilder使用html编码,但StringBuilder不使用。因此,使用TagBuilder来克服可能通过XSS攻击被利用的漏洞更为安全。
- 1. 使用StringBuilder而不是toString()
- 2. 什么是使用StringBuilder的之间的区别,而不是字符串
- 3. 为什么使用HTML而不是HAML?
- 4. 为什么,而不是使用回调
- 5. 为什么使用classmethod而不是staticmethod?
- 6. 为什么使用TCPDF而不是mpdf
- 7. 为什么使用leal而不是incq?
- 8. 为什么使用iconv_strpos而不是strpos?
- 9. 为什么使用s:Line而不是mx:HRule?
- 10. 为什么使用uImage而不是zImage
- 11. 为什么使用DataSource而不是XADataSource?
- 12. 为什么使用char []而不是String?
- 13. 为什么使用结构,而不是
- 14. 为什么使用registerDefaults:而不是setValue:forKey:?
- 15. 为什么使用追加()而不是+
- 16. 为什么使用Number.parseInt而不是parseInt()?
- 17. 为什么说零而不是停用?
- 18. 为什么要使用Create方法而不是使用“new”?
- 19. 为什么使用项目编译gtest而不是使用lib
- 20. 为什么StringBuilder类不是从Stream继承的?
- 21. 为什么不推荐使用assert_template,而应该使用什么?
- 22. 为什么retainCount是0而不是1?
- 23. 使用什么而不是respond_with
- 24. 什么使用,而不是memcache
- 25. 什么使用,而不是eval在jquery
- 26. 使用什么而不是'GoTo'?
- 27. 什么使用,而不是黑屏
- 28. 什么使用,而不是FileReader for Safari?
- 29. 使用什么而不是find_with_ids()?
- 30. 什么使用,而不是initWithStyle:reuseIdentifier:
对于上面的简单标签,我更喜欢'sb.AppendFormat(“”,link,cssClass);'但TagBuilder上的方法真的很整洁一个需要更复杂的标签。 – Don 2010-06-15 10:54:49
请注意他询问有关建立一张桌子,即他可能嵌套桌子,tbody,然后是多个trs和tds。他会不会每个人都需要一个tagbuilder?我希望这会比等效的stringbuilder变得更加混乱。 – Rup 2010-06-15 12:01:33
“>”更加清爽。它的速度很快,因为1)字符串连接速度很快,最终结果是单个字符串,并且2)不提前优化。对于更复杂的情况(如表格),我建议像Spark这样的模板引擎。我见过使用TagBuilder的源代码,这仍然很难理解。 – queen3 2010-06-15 14:26:05