【发布时间】:2010-06-15 08:35:56
【问题描述】:
使用标签生成器和字符串生成器在 htmlhelper 类中创建表或使用 HtmlTable 有什么区别?
他们产生的不是同样的东西吗??
【问题讨论】:
标签: c# asp.net-mvc extension-methods stringbuilder tagbuilder
使用标签生成器和字符串生成器在 htmlhelper 类中创建表或使用 HtmlTable 有什么区别?
他们产生的不是同样的东西吗??
【问题讨论】:
标签: c# asp.net-mvc extension-methods stringbuilder tagbuilder
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("<a href='{0}' class = '{1}'/>", link, cssClass);,但是如果需要更复杂的标签,TagBuilder 上的方法真的很简洁。
这只是方便。来自this tutorial:
您实际上并不需要使用 TagBuilder 类。 您可以使用 StringBuilder 类 反而。但是,TagBuilder 类 让您的生活更轻松。
看看 TagBuilder 上的方法,想想它们是否给你带来了价值。你想每次都在StringBuilder 中手动做同样的事情吗?有逃避它为你做的吗?属性合并等?生成的代码是否更易于阅读,从而更清楚地表明您正在构建标签而不是任意字符串?
【讨论】:
HtmlHelpers
到目前为止,其他答案都错过了一点。如果您从扩展方法返回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。
【讨论】:
他们产生的不是同样的东西吗??
嗯,当然,但这不应该是一种威慑,不是吗?一个类是为比另一个类更具体的东西而设计的,因此它提供了更大程度的便利。
我可以问:为什么要使用StringBuilder?为什么不是List<char>?我不能从中生成相同的东西吗?
更进一步:为什么还要List<char>?为什么不只是一个char[],我可以控制自己的大小调整/操作?我仍然可以完全从char[] 创建一个string。
事实上,我真正需要的只是一个char* 和一个int(用于长度)。对吧?
我的意思是,如果一个类可用于您可以使用的特殊功能,那么如果您问我,使用它是有意义的。
【讨论】:
正如其他帖子中提到的,TagBuilder 带来了一些便利。 但是您应该考虑到 TagBuilder 和 StringBuilder 可能不会产生相同的结果。 TagBuilder 应用 html 编码,但 StringBuilder 没有。因此,使用 TagBuilder 来克服可能被 XSS 攻击利用的漏洞会更安全。
【讨论】:
如果您使用 StringBuilder,请不要忘记对值进行 HTML 编码。我希望 TagBuilder 自动完成。
【讨论】: