2010-06-15 89 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攻擊被利用的漏洞更爲安全。