Создание строк HTML в методах расширения HtmlHelper - PullRequest
4 голосов
/ 04 ноября 2010

Может ли кто-то быть добрым и объяснить, почему я должен писать строки следующим образом:

    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 ]

4 голосов
/ 04 ноября 2010

Нет веской причины. Я бы сказал, скорость, поскольку 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 голос
/ 04 ноября 2010

TagBuilder просто гарантирует, что ваш HTML правильно сформирован. Я склонен использовать tagbuilder для всего, для чего я бы использовал несколько строк в HTML, например, как span внутри href внутри div для дополнительной защиты от опечаток.

...