Как преобразовать TagBuilder в строку?

Делаю проект на asp.net и для вывода таблицы из БД необходимо сделать пагинацию. В общем-то всё работает, кроме хелпера для вывода панели ссылок со страницами. Код хелпера выглядит следующим образом:

public static class PagingHelpers
{
    public static HtmlString PageLinks(this IHtmlHelper html, PageInfo pageInfo, Func<int, string> pageUrl)
    {
        StringBuilder result = new StringBuilder();
        for (int i = 1; i <= pageInfo.totalPages; i++)
        {
            TagBuilder tag = new TagBuilder("a");
            tag.MergeAttribute("href", pageUrl(i));
            tag.InnerHtml.AppendHtml(i.ToString());

            if (i == pageInfo.pageNumber)
            {
                tag.AddCssClass("selected");
                tag.AddCssClass("btn-primary");
            }
            tag.AddCssClass("btn btn-default");

            result.Append(tag.ToString());
        }

        return new HtmlString(result.ToString());
    }
}

Однако вместо ссылок многократно выводится тип переменной tag. Поставил брекпоинт после выполнения цикла. Показывает, что тег со ссылкой сформировался правильно, только вот в result записывается не строка с тегом, а вот это значение: Microsoft.AspNetCore.Mvc.ViewFeatures.TagBuilder. Как сделать так, чтобы в result всё-таки записывались именно теги?


Ответы (1 шт):

Автор решения: aepot

Ни разу не пользовался, но почитал документацию, думаю что получится через StringWriter.

public static HtmlString PageLinks(this IHtmlHelper html, PageInfo pageInfo, Func<int, string> pageUrl)
{
    StringWriter sw = new();
    for (int i = 1; i <= pageInfo.totalPages; i++)
    {
        TagBuilder tag = new("a");
        tag.MergeAttribute("href", pageUrl(i));
        tag.InnerHtml.AppendHtml(i.ToString());

        if (i == pageInfo.pageNumber)
        {
            tag.AddCssClass("selected");
            tag.AddCssClass("btn-primary");
        }
        tag.AddCssClass("btn btn-default");

        tag.WriteTo(sw, HtmlEncoder.Default);
    }

    return new HtmlString(sw.ToString());
}

Почему кстати вы возвращаете HtmlString, а не например IHtmlContent? Если такое возможно, то код можно улучшить и память сэкономить используя HtmlContentBuilder.

public static IHtmlContent PageLinks(this IHtmlHelper html, PageInfo pageInfo, Func<int, string> pageUrl)
{
    HtmlContentBuilder hb = new();
    for (int i = 1; i <= pageInfo.totalPages; i++)
    {
        TagBuilder tag = new("a");
        tag.MergeAttribute("href", pageUrl(i));
        tag.InnerHtml.AppendHtml(i.ToString());

        if (i == pageInfo.pageNumber)
        {
            tag.AddCssClass("selected");
            tag.AddCssClass("btn-primary");
        }
        tag.AddCssClass("btn btn-default");

        hb.AppendHtml(tag);
    }

    return hb;
}
→ Ссылка