Как преобразовать 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 шт):
Ни разу не пользовался, но почитал документацию, думаю что получится через 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;
}