C# 为什么使用TagBuilder而不是StringBuilder?

C# 为什么使用TagBuilder而不是StringBuilder?,c#,asp.net-mvc,extension-methods,stringbuilder,tagbuilder,C#,Asp.net Mvc,Extension Methods,Stringbuilder,Tagbuilder,使用标记生成器和字符串生成器在htmlhelper类中创建表或使用HtmlTable有什么区别 它们不是生成了相同的东西吗?这只是方便而已。发件人: 您实际上不需要使用TagBuilder类。 您可以使用StringBuilder类 相反但是,TagBuilder类 让你的生活轻松一点 查看TagBuilder上的方法,并思考它们是否为您提供了价值。您是否希望每次都在StringBuilder中手动执行相同的操作?这对你有帮助吗?属性合并等?生成的代码是否更易于阅读,从而更清楚地表明您是在构建标

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


它们不是生成了相同的东西吗?

这只是方便而已。发件人:

您实际上不需要使用TagBuilder类。 您可以使用StringBuilder类 相反但是,TagBuilder类 让你的生活轻松一点


查看TagBuilder上的方法,并思考它们是否为您提供了价值。您是否希望每次都在
StringBuilder
中手动执行相同的操作?这对你有帮助吗?属性合并等?生成的代码是否更易于阅读,从而更清楚地表明您是在构建标记而不是任意字符串?

TagBuilder
是一个专门为创建html标记及其内容而设计的类。你说的对,结果无论如何都是一个字符串,当然你仍然可以使用
StringBuilder
,结果是一样的,但是你可以用
TagBuilder
做得更简单。假设您需要生成一个标记:

<a href='http://www.stackoverflow.com' class='coolLink'/>
这不是很酷,不是吗? 并比较如何使用
TagBuilder
构建它

var tb = new TagBuilder("a");
tb.MergeAttribute("href",link);
tb.AddCssClass(cssClass);
tb.ToString(TagRenderMode.SelfClosing);
那不是更好吗

它们产生的不是相同的东西吗

当然,但这不应该是一种威慑,对吗?一个类是为比另一个更具体的东西而设计的,因此它提供了更高级别的便利性

我可能会问:为什么要使用
StringBuilder
?为什么不创建一个
列表
?我不能从其中任何一个生成相同的东西吗

更进一步:为什么连
列表都有?为什么不仅仅是一个
char[]
,我可以控制自己的大小/操作?我仍然可以完全从
char[]
创建
字符串

事实上,我真正需要的是一个
char*
和一个
int
(表示长度)。对吧?


我的观点是,如果一个类可用于您可以使用的专门功能,那么如果您要求,使用它是有意义的。

如果您使用的是StringBuilder,请不要忘记对值进行HTML编码。我希望TagBuilder能自动做到这一点。

到目前为止,其他答案都忽略了一点。如果从扩展方法返回
TagBuilder
,则可以继续在视图中添加属性。假设您从Html帮助程序返回一个表,并且希望添加一个class属性。如果使用的是
StringBuilder
,则需要将类作为参数传入

public static string Table(...., string @class)
{
    ...
    sb.AppendFormat("class='{0}", @class);
    ...
}

// In the view
<%: Html.Table(someParams, "fancy") %>
公共静态字符串表(..,string@class)
{
...
sb.AppendFormat(“class='{0}',@class);
...
}
//在视图中
但是,将class属性添加到HTML标记并不是创建表的扩展方法的问题!如果我们切换到语义模型(TagBuilder)来生成HTML,我们可以在table方法之外添加class属性

public static TagBuilder Table(....)
{
    ...
    return tag;
}

// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>
公共静态标记生成器表(…)
{
...
返回标签;
}
//在视图中

除了TagBuilder,您可能还想查看FubuMVC的HtmlTags库。这是一个更好的生成HTML的模型。我在博客上有一些。正如其他帖子中提到的,TagBuilder带来了一些便利。
但是你应该考虑TagBuilder和StringBuilder可能不会产生同样的结果。TagBuilder应用html编码,但StringBuilder不应用。因此,使用TagBuilder克服可能通过XSS攻击利用的漏洞更安全。

对于上述简单标记,我更喜欢
sb.AppendFormat(“,link,cssClass)
但是如果需要更复杂的标记,TagBuilder上的方法非常简洁。注意,他询问了关于构建表的问题,即他可能在嵌套表、tbody,然后是多个tr和tds。难道他不需要为每一个做标记吗?我想这会比同等的stringbuilder更混乱。”“更干净。它很快,因为1)字符串连接非常快,最终结果是单个字符串,2)不会过早优化。对于更复杂的情况(如表),我建议使用Spark之类的模板引擎。我见过使用TagBuilder的源代码,但这仍然很难理解。@Rup实际上,如果您使用了正确的扩展方法,那么使用TagBuilder这样的语义模型来生成嵌套的标记实际上会更干净。为什么不使用StringBuilder来构建属性并根据需要吐出标记,如:“@attributes/>我认为使用TagBuilder违背了MVC的目的。为了简洁起见,您将代码和标记混合在一起,而牺牲了更简单的修改。@Joel Rodgers TagBuilder在
HtmlHelpers
中占有一席之地,在某种程度上,您会对标记生成器感到愤怒,并实现自己的标记生成器,而您主要是在其中重用标记生成器。@Chrismaric TagBuilder不是一个封闭的类。你可以看到一个可耦合的、可链接的派生类在网络上四处游荡。@JoelRodgers我认为如果你的模板中有足够的条件内容,它开始看起来更像C代码而不是HTML,那么标记生成器就开始看起来很有意义了。
public static TagBuilder Table(....)
{
    ...
    return tag;
}

// In the view
<%: Html.Table(someParams).AddCssClass("fancy") %>