代码之家  ›  专栏  ›  技术社区  ›  jgauffin

在htmlhelper扩展方法中生成HTML字符串

  •  4
  • jgauffin  · 技术社区  · 14 年前

    有人能和蔼可亲地解释我为什么要这样写字符串吗?

        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 回复  |  直到 14 年前
        1
  •  4
  •   Domenic    14 年前

    没有什么好理由。我会说速度,因为 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.
    

    是个不错的解决方案。

        2
  •  1
  •   John Farrell    14 年前

    TagBuilder只是确保您的HTML格式正确。我倾向于使用TagBuilder来做任何我想在HTML中使用多行的事情,比如在一个DIV中的a href中使用一个跨距,以防止输入错误。