2010-06-15 84 views

回答

61

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

不是更好吗?

+12

对于上面的简单标签,我更喜欢'sb.AppendFormat(“”,link,cssClass);'但TagBuilder上的方法真的很整洁一个需要更复杂的标签。 – Don 2010-06-15 10:54:49

+1

请注意他询问有关建立一张桌子,即他可能嵌套桌子,tbody,然后是多个trs和tds。他会不会每个人都需要一个tagbuilder?我希望这会比等效的stringbuilder变得更加混乱。 – Rup 2010-06-15 12:01:33

15

这只是方便。从this tutorial

你并不需要使用TagBuilder类。 您可以改为使用StringBuilder类 。但是,TagBuilder类 让您的生活变得更轻松。

看看TagBuilder上的方法,并考虑它们是否给你带来价值。您是否想每次都手动在StringBuilder中执行相同的操作?它有逃脱,它为你做?属性合并等?结果代码是否易于阅读,使得您更清楚地构建标签而不是一些任意字符串?

+1

我认为使用TagBuilder打败了MVC的目的。为简洁起见,您将代码和标记混合在一起,代价是更易于修改。 – 2012-05-23 19:42:07

+8

@Joel Rodgers TagBuilder在'HtmlHelpers'中占据了一席之地 – 2012-11-06 07:48:15

+0

还有一点你会对标签生成器感到愤怒,并在你主要重用标签生成器的地方实现自己的目标。 – 2014-10-08 17:53:55

8

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

那么,当然,但这不应该是一种威慑,应该呢?一门课是为比其他课程更具体的课程而设计的,所以它提供了更高的便利性。

我可以问:为什么要用StringBuilder?为什么不是List<char>?我不能从两者产生相同的东西吗?

更进一步:为什么即使是一个List<char>?为什么不只是一个char[],我可以控制自己的大小/操纵?我仍然可以从char[]完全创建一个string。其实,我真正需要的是char*int(长度)。对?

我的观点是,如果一个类可用于您可以使用的专用功能,如果您问我,则使用它是有意义的。

0

如果您使用的是StringBuilder,不要忘记对值进行HTML编码。我希望TagBuilder自动执行此操作。

+2

SetInnerText将对字符串进行编码。 – SwampyFox 2013-02-28 21:03:34

11

有一点,其他答案已经错过了迄今。如果您从扩展方法返回TagBuilder,则可以继续在视图中添加属性。假设您从Html助手中返回一个表,并且您想添加一个类属性。如果您使用的是StringBuilder,则需要将该类作为参数传入。

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

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

但添加class属性的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

1

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