为什么使用TagBuilder而不是StringBuilder?

时间:2010-06-15 08:35:56

标签: c# asp.net-mvc extension-methods stringbuilder tagbuilder

使用标记构建器和字符串构建器在htmlhelper类中创建表或使用HtmlTable有什么区别?

不是他们生成同样的东西吗?

6 个答案:

答案 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能够自动执行此操作。