使用标记构建器和字符串构建器在htmlhelper类中创建表或使用HtmlTable有什么区别?
不是他们生成同样的东西吗?
答案 0 :(得分:62)
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);
那不是更好吗?
答案 1 :(得分:15)
这只是方便。来自this tutorial:
您实际上不需要使用TagBuilder类。 您可以使用StringBuilder类 代替。但是,TagBuilder类 让你的生活更轻松。
查看TagBuilder上的方法,并考虑它们是否为您提供价值。你想每次在StringBuilder
手动做同样的事吗?有没有逃脱它为你做的?属性合并等?结果代码是否更容易阅读,使您更清楚地构建标记而不是某些任意字符串?
答案 2 :(得分:12)
到目前为止,还有一点是其他答案错过了。如果您从扩展方法返回TagBuilder
,则可以继续在视图中添加属性。假设您从Html帮助器返回一个表,并且您想要添加一个类属性。如果您使用的是StringBuilder
,则需要将该类作为参数传递。
public static string Table(...., string @class)
{
...
sb.AppendFormat("class='{0}", @class);
...
}
// In the view
<%: Html.Table(someParams, "fancy") %>
但是将类属性添加到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。
答案 3 :(得分:8)
不是他们生成同样的东西吗?
嗯,当然,但这应该不是一种威慑力,不是吗?一个类是针对比另一个类更具体的东西而设计的,因此它提供了更大的便利性。
我可以问:为什么要使用StringBuilder
?为什么不是List<char>
?我不能从两者中产生同样的东西吗?
更进一步:为什么即使是List<char>
?为什么不只是char[]
,我可以控制自己的调整大小/操纵?我仍然可以从string
完全创建char[]
。
事实上,我真正需要的只是char*
和int
(长度)。正确?
我的观点是,如果一个类可用于您可以使用的专用功能,那么在您问我时使用它是有意义的。
答案 4 :(得分:1)
正如其他帖子中提到的,TagBuilder带来了一些便利。 但是您应该考虑TagBuilder和StringBuilder可能不会产生相同的结果。 TagBuilder应用html编码,但StringBuilder没有。因此,使用TagBuilder来克服可能通过XSS攻击利用的漏洞更安全。
答案 5 :(得分:0)
如果您使用的是StringBuilder,请不要忘记对值进行HTML编码。我希望TagBuilder能够自动执行此操作。