在HtmlHelper扩展方法中构建html字符串

时间:2010-11-04 12:27:56

标签: asp.net-mvc html-helper

有人可以善解并解释为什么我应该用这种方式写字符串:

    public static MvcHtmlString Render(this HtmlHelper htmlHelper, MenuItem menuItem)
    {
        if (!menuItem.IsVisible)
            return MvcHtmlString.Empty;

        var li = new TagBuilder("li");
        var a = new TagBuilder("a");
        a.MergeAttribute("href", menuItem.Uri);
        a.SetInnerText(menuItem.Title);
        li.InnerHtml = a.ToString();
        return MvcHtmlString.Create(li.ToString());
    }

当这个更清洁时:

    public static MvcHtmlString Render(this HtmlHelper htmlHelper, MenuItem item)
    {
        if (!item.IsVisible)
            return MvcHtmlString.Empty;

        var str = string.Format(@"<li><a href=""{0}"">{1}</a></li>", item.Uri, item.Title);
        return MvcHtmlString.Create(str.ToString());
    }

有什么好处?

2 个答案:

答案 0 :(得分:4)

没有很好的理由。我会说速度,因为TagBuilder基本上是一个专门的StringBuilder,已知它比string.Format更快,但我需要看一些基准,因为它看起来像整个HTML结构可能会减慢速度。

您可能想要使用它的一个例子是它使条件逻辑更容易。我想例如像

这样的东西
var theClass = item.Title.Length > 5 ? " class=\"Long\"" : "";
var str = string.Format(@"<li><a href=""{0}""{1}>{2}</a></li>", item.Uri, theClass, item.Title);

不是很清楚或干净,而

if (item.Title.Length > 5)
{
    a.AddCssClass("Long");
}
// And then all that other stuff.

是一个非常好的解决方案。

答案 1 :(得分:1)

TagBuilder只是确保您的HTML格式正确。我倾向于使用tagbuilder来处理任何我在HTML中使用多行的内容,例如div中的href内的跨度,以便提供额外的拼写错误保护。