我的ASP.NET MVC应用程序有一个Html Helper文件。他们中的大多数只是返回一个格式化的字符串。
以下是我的一个格式化字符串助手的示例:
public static string Label(this HtmlHelper helper, string @for, string text)
{
return string.Format("<label for \"{0}\">{1}</label>", @for, text);
}
这是一个TagBuilder版本,它给出了与上面相同的结果:
public static string Label(this HtmlHelper helper, string @for, string text)
{
var builder = new TagBuilder("label");
builder.Attributes.Add("for", @for);
builder.SetInnerText(text);
return builder.ToString(TagRenderMode.Normal);
}
现在,我已经从混合实现中读取/学习MVC的一些站点。有些使用TagBuilder
方法,有些使用string.Format()
,有些则互换使用。
标签标签相当简单,那么返回格式化字符串而不是为这样的标签实例化TagBuilder
类会“更好”吗?
我不一定担心性能,我只是好奇为什么有些人选择TagBuilder而其他人使用格式化字符串。
感谢您的启发!
答案 0 :(得分:6)
使用TagBuilder将允许您合并标签上的属性。例如,使用String.Format,如果要在标记上有条件地具有CSS Class属性,则需要执行以下操作:
String.Format("<label {0}>Text</label>", (includeClass ? "class=\"Something\"" : ""));
使用TagBuilder,您可以使用MergeAttributes()传递键/值的字典。弹出打开Reflector(或获取源代码)并查看System.Web.Mvc.Html.InputHelper()以了解使用具有大量条件属性的构建器的强大功能。
两者都可以产生相同的输出,但这实际上取决于您希望实现的目标。它还取决于您认为哪些是“更干净”的代码。
答案 1 :(得分:2)
Tagbuilder是一个便利类。它存储标签属性的字典,然后一次输出所有HTML。您也不必处理附加尖括号。它基本上与您的代码执行相同的操作,如果您只有一个属性,您的方式可能同样方便。
HTML帮助程序在内部使用Tagbuilder。
答案 2 :(得分:0)
TagBuilder处理属性值的HTML编码:SetInnerText()编码,.InnerHTML不编码。此外,如果您返回TagBuilder而不是字符串,则可以在流程中稍后轻松添加CSS类或属性。