【问题标题】:Why use TagBuilder instead of StringBuilder?为什么使用 TagBuilder 而不是 StringBuilder?
【发布时间】:2010-06-15 08:35:56
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    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);
    

    这样不是更好吗?

    【讨论】:

    • 对于上面的简单标签,我更喜欢sb.AppendFormat("&lt;a href='{0}' class = '{1}'/&gt;", link, cssClass);,但是如果需要更复杂的标签,TagBuilder 上的方法真的很简洁。
    • 请注意,他询问了有关构建表的问题,即他可能正在嵌套表、tbody,然后是多个 trs 和 tds。他不需要一个标签生成器来处理这些吗?我希望这会比等效的字符串生成器更加混乱。
    • "" 更加简洁。而且它很快,因为 1)字符串连接非常快,最终结果无论如何都是单个字符串,并且 2)不要过早优化。对于更复杂的情况(如表格),我建议使用 Spark 等模板引擎。我见过使用 TagBuilder 的资源,但仍然很难理解。
    • @Rup 实际上,如果您使用正确的扩展方法,使用 TagBuilder 之类的语义模型来生成嵌套标签实际上要干净得多。
    • 为什么不使用 StringBuilder 来构建您的属性并根据需要吐出标签,如下所示:
    【解决方案2】:

    这只是方便。来自this tutorial

    您实际上并不需要使用 TagBuilder 类。 您可以使用 StringBuilder 类 反而。但是,TagBuilder 类 让您的生活更轻松。

    看看 TagBuilder 上的方法,想想它们是否给你带来了价值。你想每次都在StringBuilder 中手动做同样的事情吗?有逃避它为你做的吗?属性合并等?生成的代码是否更易于阅读,从而更清楚地表明您正在构建标签而不是任意字符串?

    【讨论】:

    • 我认为使用 TagBuilder 违背了 MVC 的目的。为了简洁起见,您将代码和标记混合在一起,而以更容易修改为代价。
    • @Joel Rodgers TagBuilder 在HtmlHelpers
    • 有些时候你会对标签生成器感到愤怒,并在你主要重复使用标签生成器的地方实现自己的。
    • @ChrisMarisic TagBuilder 不是密封类。您可以在 Web 上看到一个可耦合的可链接派生类。
    【解决方案3】:

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

    public static string Table(...., string @class)
    {
        ...
        sb.AppendFormat("class='{0}", @class);
        ...
    }
    
    // In the view
    <%: Html.Table(someParams, "fancy") %>
    

    但是向 HTML 标记添加类属性不是创建表格的扩展方法的问题!如果我们切换到语义模型(TagBuilder)来生成 HTML,我们可以在 table 方法之外添加 class 属性。

    public static TagBuilder Table(....)
    {
        ...
        return tag;
    }
    
    // In the view
    <%: Html.Table(someParams).AddCssClass("fancy") %>
    

    除了 TagBuilder,您可能还想查看 FubuMVC 的 HtmlTags 库。这是一个更好的生成 HTML 的模型。我在博客上有一些more details

    【讨论】:

      【解决方案4】:

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

      嗯,当然,但这不应该是一种威慑,不是吗?一个类是为比另一个类更具体的东西而设计的,因此它提供了更大程度的便利。

      我可以问:为什么要使用StringBuilder?为什么不是List&lt;char&gt;?我不能从中生成相同的东西吗?

      更进一步:为什么还要List&lt;char&gt;?为什么不只是一个char[],我可以控制自己的大小调整/操作?我仍然可以完全从char[] 创建一个string

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

      我的意思是,如果一个类可用于您可以使用的特殊功能,那么如果您问我,使用它是有意义的。

      【讨论】:

        【解决方案5】:

        正如其他帖子中提到的,TagBuilder 带来了一些便利。 但是您应该考虑到 TagBuilder 和 StringBuilder 可能不会产生相同的结果。 TagBuilder 应用 html 编码,但 StringBuilder 没有。因此,使用 TagBuilder 来克服可能被 XSS 攻击利用的漏洞会更安全。

        【讨论】:

          【解决方案6】:

          如果您使用 StringBuilder,请不要忘记对值进行 HTML 编码。我希望 TagBuilder 自动完成。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-18
            • 2014-10-06
            • 2018-02-27
            • 2010-10-04
            • 1970-01-01
            • 2016-02-11
            • 2016-12-17
            相关资源
            最近更新 更多