为什么使用TagBuilder而不是StringBuilder?
使用标记生成器和字符串生成器在htmlhelper类中创建表或使用HtmlTable有什么区别?为什么使用TagBuilder而不是StringBuilder?
它们是不是产生了相同的东西?
TagBuilder
是专门为创建html标签及其内容而设计的类。你说得对,结果无论如何都是一个字符串,当然你仍然可以使用StringBuilder
,结果是一样的,但是你可以用TagBuilder
做更简单的事情。比方说,你需要生成一个标记:
<a href='http://www.*.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攻击被利用的漏洞更为安全。
对于上面的简单标签,我更喜欢'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