使用标签生成器和字符串生成器在 htmlhelper 类中创建表或使用 HtmlTable 有什么区别?
他们不是产生同样的东西吗?
使用标签生成器和字符串生成器在 htmlhelper 类中创建表或使用 HtmlTable 有什么区别?
他们不是产生同样的东西吗?
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);
那不是更好吗?
这只是方便。从本教程:
您实际上并不需要使用 TagBuilder 类。您可以改用 StringBuilder 类。但是,TagBuilder 类使您的生活更轻松。
看看 TagBuilder 上的方法,想想它们是否能给你带来价值。你想StringBuilder
每次都自己手动做同样的事情吗?有逃避它为你做的吗?属性合并等?生成的代码是否更易于阅读,从而更清楚地表明您正在构建标签而不是任意字符串?
到目前为止,其他答案都错过了一点。如果您TagBuilder
从扩展方法返回,您可以继续在视图中添加属性。假设您正在从 Html 帮助程序返回一个表,并且您想要添加一个类属性。如果您使用的是 a 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 的模型。我在博客上有更多细节。
他们不是产生同样的东西吗?
好吧,当然,但这不应该是一种威慑,不是吗?一类是为比另一类更具体的东西而设计的,因此它提供了更大程度的便利。
我可以问:为什么要使用 a StringBuilder
?为什么不是一个List<char>
?我不能从中生成相同的东西吗?
更进一步:为什么还要List<char>
? 为什么不只是 a char[]
,我可以控制自己的大小调整/操作?我仍然可以完全string
从char[]
.
事实上,我真正需要的是一个char*
和一个int
(长度)。对?
我的观点是,如果一个类可用于您可以使用的特殊功能,那么如果您问我,使用它是有意义的。
正如其他帖子中提到的,TagBuilder 带来了一些便利。但是您应该考虑到 TagBuilder 和 StringBuilder 可能不会产生相同的结果。TagBuilder 应用 html 编码,但 StringBuilder 没有。因此,使用 TagBuilder 来克服可能被 XSS 攻击利用的漏洞会更安全。
如果您使用 StringBuilder,请不要忘记对值进行 HTML 编码。我希望 TagBuilder 自动执行此操作。