【问题标题】:Build html strings in HtmlHelper extension methods在 HtmlHelper 扩展方法中构建 html 字符串
【发布时间】:2010-11-04 12:27:56
【问题描述】:

谁能好心解释一下我为什么要这样写字符串:

    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());
    }

有什么好处?

【问题讨论】:

    标签: asp.net-mvc html-helper


    【解决方案1】:

    没有一个很好的理由。我会说速度,因为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.
    

    是一个很好的解决方案。

    【讨论】:

    • 同样值得注意的是 MergeAttributes 方法和 InnerHtml getter/setter。绝对可以省去很多编码的痛苦!
    【解决方案2】:

    TagBuilder 只是确保您的 HTML 格式正确。我倾向于将 tagbuilder 用于任何我会在 HTML 中使用多行的内容,例如 div 中的 href 内的 span,以防止拼写错误。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多