4

我的 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 而其他人使用格式化字符串。

谢谢开导!

4

3 回答 3

6

使用 TagBuilder 将允许您合并标签上的属性。例如,使用 String.Format,如果您想有条件地在标签上使用 CSS Class 属性,您需要执行以下操作:

String.Format("<label {0}>Text</label>", (includeClass ? "class=\"Something\"" : ""));

而使用 TagBuilder,您可以使用 MergeAttributes() 传入键/值字典。弹出打开反射器(或获取源代码)并查看 System.Web.Mvc.Html.InputHelper() 以了解使用具有大量条件属性的构建器的强大功能。

两者都可以产生相同的输出,但这实际上取决于您要实现的目标。它还取决于您认为哪个是“更干净”的代码。

于 2009-09-28T14:51:29.083 回答
2

Tagbuilder 是一个便利类。它存储标签属性的字典,然后一次性输出所有 HTML。您也不必处理附加尖括号。它本质上与您的代码所做的事情相同,如果您只有一个属性,那么您的方式可能同样方便。

Tagbuilder 由 HTML Helpers 在内部使用。

于 2009-09-28T14:42:47.757 回答
0

TagBuilder 处理属性值的 HTML 编码: SetInnerText() 编码, .InnerHTML 不。此外,如果您返回一个 TagBuilder 而不是一个字符串,您可以在稍后的流程中轻松添加 CSS 类或属性。

为什么使用 TagBuilder 而不是 StringBuilder?

于 2012-04-03T04:39:34.033 回答