Содержание
Объект класса TagHelperOutput
позволяет управлять выводом tag-хэлпера. До сих пор мы использовали объект этого класса в ограниченном виде — просто указывали html-тэг для хэлпера и содержимое этого тэга. В этой части мы более подробно познакомимся с классом TagHelperOutput
Свойства класса TagHelperOutput
Ниже представлены основные свойства класса TagHelperOutput
, действие которых мы сегодня рассмотрим:
Attributes |
коллекция атрибутов, устанавливаемых у создаваемого элемента html |
Content |
содержимое генерируемого элемента html в виде объекта TagHelperContent |
Post |
содержимое, которое устанавливается после создаваемого элемента html |
Post |
представляет html-элемент, который добавляется после создаваемого элемента html |
Pre |
представляет содержимое, которое устанавливается перед создаваемым элементом html |
Pre |
представляет html-элемент, который добавляется перед создаваемым элементом html |
Tag |
формат создаваемого элемента |
Tag |
указывает, какой элемент html будет создаваться вместо тега хелпера |
Для демонстрации работы этих свойств воспользуемся tag-хэлперами, разработанными ранее.
Формат элемента (свойство Tag Mode)
Свойство TagMode
позволяет задать формат элемента tag-хэлпера и является перечислением следующего вида:
StartTagAndEndTag |
0 | html-элемент содержит и открывающий и закрывающий тэг |
SelfClosing |
1 | html-элемент содержит один самозакрывающийся тег, например, <tag/> |
StartTagOnly |
2 | html-элемент сдержит только открывающий тэг |
Например, вернемся к нашим tag-хэлперам и посмотрим на хэлпер для вывода дня недели:
public class DayTagHelper: TagHelper { public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; output.Content.SetContent($"Сегодня {DateTime.Now:dddd}"); } }
этот tag-хэлпер использует для генерации html-разметки строку с днем недели, поэтому такой тэг должен содержать в html-разметке и открывающий и закрывающий теги, то есть, свойство TagMode
должно иметь значение StartTagAndEndTag
, что, собственно, и сделано по умолчанию. Если же мы попробуем изменить это свойство так:
output.TagMode = TagMode.SelfClosing;
То в приложении вместо строки с днем недели мы получим вот такую html-разметку:
<div/>
Значение TagMode.SelfClosing
стоит использовать только в том случае, если предполагается, что ваш tag-хэлпер не будет выводить никакой информации. В свою очередь, значение TagMode.StartTagOnly
стоит использовать в том случае, если предполагается, что закрывающий тэг в html-разметке будет сгенерирован за пределами tag-хэлпера, например в другом хэлпере.
Управление содержимым (свойство Content)
Этим свойством мы уже пользовались. Однако, класс TagHelperContent
которым и представлено свойство Content
содержит ряд других методов, позволяющих управлять содержимым, а именно:
Append() |
Добавляет текст к существующему содержимому. |
Append |
Добавляет к существующему содержимому текст в формате html. |
Clear() |
Очищает содержимое. |
Get |
Возвращает содержимое. |
Set |
Задает содержимое в виде текста. |
Set |
Задает содержимое в формате html. |
Таким образом, используя свойства TagHelperOutput
и методы TagHelperContent
мы можем изменять содержимое html-разметки нашего tag-хэлпера. Для примера, воспользуемся tag-хэлпером, который мы создали в предыдущей части, вот как выглядит его код на данный момент:
using Microsoft.AspNetCore.Razor.TagHelpers; namespace AspNetMvcTagCreate.TagHelpers { public class DayInfoTagHelper: TagHelper { public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var childContent = await output.GetChildContentAsync(); string content = "<h3>День недели</h3>"; output.TagName = "div"; content += childContent.GetContent(); output.Content.SetHtmlContent(content); } } }
В приложении этот tag-хэлпер генерирует следующую html-разметку:
<div><h3>День недели</h3> <div>Сегодня воскресенье</div> <div>Номер дня в году 330</div> </div>
Изменим код tag-хэлпера следующим образом:
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var childContent = await output.GetChildContentAsync(); output.TagName = "div"; output.PreElement.AppendHtml("<div class=\"card\" style=\"width: 18rem;\">"); output.PreElement.AppendHtml("<h5 class=\"card-title\">День недели</h5>"); output.Content.SetHtmlContent(childContent.GetContent()); output.PostElement.AppendHtml("</div>"); }
здесь мы добавляем перед содержимым тэга ещё один элемент div
и заголовок h5
и после содержимого tag-хэлпера добавляем закрывающий тэг для div
. В результате, мы получим следующую html-разметку:
<div class="card" style="width: 18rem;"><h5 class="card-title">День недели</h5><div> <div>Сегодня воскресенье</div> <div>Номер дня в году 330</div> </div></div>
в браузере такая разметка будет выглядеть следующим образом:
Установка атрибутов в html-разметке (свойство Attributes)
Предыдущий пример получился не совсем удачным с точки зрения генерируемой html-разметки. Зачем нам лишний элемент div
? Свойство Attributes
позволяет нам устанавливать атрибуты генерируемого html-элемента и представляет собой объект класса TagHelperAttributeList
, который содержит следующие методы:
Add(string name, object value) |
добавляет атрибут с именем name и значением value |
RemoveAll(string name) |
удаляет все атрибуты с именем name |
SetAttribute(string name, object value) |
устанавливает для атрибута с именем name значение value |
Clear() |
удаляет все атрибуты |
Перепишем наш пример с использованием свойства Attributes
, избавившись тем самым, от лишнего div в разметке:
public class DayInfoTagHelper : TagHelper { public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var childContent = await output.GetChildContentAsync(); output.TagName = "div"; output.Attributes.Add("class", "card"); output.Attributes.Add("style", "width: 18rem;"); string content = "<h5 class=\"card-title\">День недели</h5>" + childContent.GetContent(); output.Content.SetHtmlContent(content); } }
Теперь будет генерироваться следующая разметка:
<div class="card" style="width: 18rem;"><h5 class="card-title">День недели</h5> <div>Сегодня воскресенье</div> <div>Номер дня в году 330</div> </div>
Атрибуты tag-хэлпера
Кроме того, что мы можем управлять атрибутами html-тэгов, наши tag-хэлперы также могут содержать свои атрибуты, которые, по сути, являются публичными свойствами класса хэлпера. Например, нам может потребоваться вывести свой текст вместо строки «Сегодня» в tag-хэлпере дня недели или задать свой стиль какого-либо элемента и т.д. Перепишем класс хэлпера для вывода дня недели следующим образом:
using Microsoft.AspNetCore.Razor.TagHelpers; namespace AspNetMvcTagCreate.TagHelpers { public class DayTagHelper: TagHelper { public string Prefix { get; set; } = "Сегодня"; public string Color { get; set; } = "black"; public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; output.Attributes.SetAttribute("style", $"color:{Color}"); output.Content.SetContent($"{Prefix} {DateTime.Now:dddd}"); } } }
Здесь мы определили два свойства для tag-хэлпера — текст перед днем недели (Prefix
) и цвет текста (Color
). Теперь мы можем воспользоваться нашим tag-хэлпером, например, так:
<day-info> <day color="red" prefix="День недели:"></day> <day-number></day-number> </day-info>
и получить такой вывод:
Аналогичным образом мы можем передавать в tag-хэлперы сложные объекты. Например, изменим код хэлпера DayInfoTagHelper
следующим образом
namespace AspNetMvcTagCreate.TagHelpers { public class DayInfoStyle { public string Width { get; set; } = "18rem"; public string Header { get; set; } = "День недели"; public DayInfoStyle(string width, string header) { Width = width; Header = header; } } public class DayInfoTagHelper : TagHelper { public DayInfoStyle? Style { get; set; } public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var childContent = await output.GetChildContentAsync(); output.TagName = "div"; output.Attributes.Add("class", "card"); string content; if (string.IsNullOrEmpty(Style?.Width)==false) { output.Attributes.Add("style", $"width: {Style.Width};"); } else { output.Attributes.Add("style", $"width: 18rem;"); } if (string.IsNullOrEmpty(Style?.Header) == false) { content = $"<h5 class=\"card-title\">{Style.Header}</h5>"; } else { content = $"<h5 class=\"card-title\">День недели</h5>"; } output.Content.SetHtmlContent(content + childContent.GetContent()); } } }
Теперь мы можем передавать в качестве аргумента объект:
<day-info style="@(new DayInfoStyle("100%","Инфа"))"> <day color="red" prefix="День недели:"></day> <day-number></day-number> </day-info>
результат:
Итого
Управление выводом tag-хэлпера осуществляется с использованием свойств объекта TagHelperOutput
. При генерации html-разметки тэга мы можем добавлять текст или другую html-разметку перед и после html-тэга хэлпера, добавлять атрибуты к html-тегу хэлпера и т.д. При необходимости, мы можем определить классе tag-хэлпера публичные свойства, которые будут использоваться в качестве атрибутов tag-хэлпера.