回答
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);
不是更好嗎?
這只是方便。從this tutorial:
你並不需要使用TagBuilder類。 您可以改爲使用StringBuilder類 。但是,TagBuilder類 讓您的生活變得更輕鬆。
看看TagBuilder上的方法,並考慮它們是否給你帶來價值。您是否想每次都手動在StringBuilder
中執行相同的操作?它有逃脫,它爲你做?屬性合併等?結果代碼是否易於閱讀,使得您更清楚地構建標籤而不是一些任意字符串?
我認爲使用TagBuilder打敗了MVC的目的。爲簡潔起見,您將代碼和標記混合在一起,代價是更易於修改。 – 2012-05-23 19:42:07
@Joel Rodgers TagBuilder在'HtmlHelpers'中佔據了一席之地 – 2012-11-06 07:48:15
還有一點你會對標籤生成器感到憤怒,並在你主要重用標籤生成器的地方實現自己的目標。 – 2014-10-08 17:53:55
他們是不是產生同樣的東西?
那麼,當然,但這不應該是一種威懾,應該呢?一門課是爲比其他課程更具體的課程而設計的,所以它提供了更高的便利性。
我可以問:爲什麼要用StringBuilder
?爲什麼不是List<char>
?我不能從兩者產生相同的東西嗎?
更進一步:爲什麼即使是一個List<char>
?爲什麼不只是一個char[]
,我可以控制自己的大小/操縱?我仍然可以從char[]
完全創建一個string
。其實,我真正需要的是char*
和int
(長度)。對?
我的觀點是,如果一個類可用於您可以使用的專用功能,如果您問我,則使用它是有意義的。
如果您使用的是StringBuilder,不要忘記對值進行HTML編碼。我希望TagBuilder自動執行此操作。
SetInnerText將對字符串進行編碼。 – SwampyFox 2013-02-28 21:03:34
有一點,其他答案已經錯過了迄今。如果您從擴展方法返回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。
正如其他文章中提到的那樣,TagBuilder帶來了一些便利。 但是你應該考慮到TagBuilder和StringBuilder可能不會產生相同的結果。 TagBuilder使用html編碼,但StringBuilder不使用。因此,使用TagBuilder來克服可能通過XSS攻擊被利用的漏洞更爲安全。
- 1. 使用StringBuilder而不是toString()
- 2. 什麼時候是`StringBuilder`而不是將`String`追加到`String`?
- 3. 什麼是使用StringBuilder的之間的區別,而不是字符串
- 4. 爲什麼使用classmethod而不是staticmethod?
- 5. 爲什麼使用iconv_strpos而不是strpos?
- 6. 爲什麼使用registerDefaults:而不是setValue:forKey:?
- 7. 爲什麼,而不是使用回調
- 8. 爲什麼使用結構,而不是
- 9. 爲什麼使用StringWriter而不是StringBuffer?
- 10. 爲什麼使用s:Line而不是mx:HRule?
- 11. 爲什麼使用ImageIcon而不是Image?
- 12. 爲什麼使用SQLiteOpenHelper而不是SQLiteDatabase?
- 13. 爲什麼使用MapFragment而不是SupportMapFragment?
- 14. 爲什麼使用FloatBuffer而不是float []?
- 15. 爲什麼使用追加()而不是+
- 16. 爲什麼使用Number.parseInt而不是parseInt()?
- 17. 爲什麼使用JLE而不是JL?
- 18. 爲什麼使用isinstance()而不是type()?
- 19. 爲什麼使用NoSQL而不是RDBMS?
- 20. 爲什麼使用uImage而不是zImage
- 21. 爲什麼使用HTML而不是HAML?
- 22. 爲什麼使用leal而不是incq?
- 23. 爲什麼使用TCPDF而不是mpdf
- 24. 爲什麼使用DataSource而不是XADataSource?
- 25. 爲什麼使用'='而不是':='?
- 26. 爲什麼使用char []而不是String?
- 27. Taghelper使用Tagbuilder和stringbuilder呈現output.precontent的問題
- 28. 爲什麼StringBuilder類是密封的?
- 29. 爲什麼我可以使用StringBuilder而不在scala中顯式導入它?
- 30. 爲什麼=而不是:?
對於上面的簡單標籤,我更喜歡'sb.AppendFormat(「」,link,cssClass);'但TagBuilder上的方法真的很整潔一個需要更復雜的標籤。 – Don 2010-06-15 10:54:49
請注意他詢問有關建立一張桌子,即他可能嵌套桌子,tbody,然後是多個trs和tds。他會不會每個人都需要一個tagbuilder?我希望這會比等效的stringbuilder變得更加混亂。 – Rup 2010-06-15 12:01:33
「>」更加清爽。它的速度很快,因爲1)字符串連接速度很快,最終結果是單個字符串,並且2)不提前優化。對於更復雜的情況(如表格),我建議像Spark這樣的模板引擎。我見過使用TagBuilder的源代碼,這仍然很難理解。 – queen3 2010-06-15 14:26:05