Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Как и другие классы, tag-хелпер может получать зависимости, которые установлены в приложении с помощью механизма dependency injection.
Например, пусть у нас будут определены в проекте следующие сущности:
namespace TagHelpersApp.Services { public interface ITimeService { string GetTime(); } public class SimpleTimeService : ITimeService { public string GetTime() => System.DateTime.Now.ToString("HH:mm:ss"); } }
Зарегистрируем сервис ITimeService в методе
public class Startup { // ................ public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddTransient<ITimeService, SimpleTimeService>(); } // остальное содержимое }
Теперь мы можем получить сервис ITimeService в конструкторе класса тег-хелпера:
using Microsoft.AspNetCore.Razor.TagHelpers; using TagHelpersApp.Services; // пространство имен сервиса ITimeService namespace TagHelpersApp.TagHelpers { public class TimerTagHelper : TagHelper { ITimeService timeService; public TimerTagHelper(ITimeService timeServ) { timeService = timeServ; } public override void Process(TagHelperContext context, TagHelperOutput output) { output.TagName = "div"; output.TagMode = TagMode.StartTagAndEndTag; output.Content.SetContent($"Текущее время: {timeService.GetTime()}"); } } }
Кроме того, мы можем использовать получение зависимостей в виде свойств. Данная возможность предоставляется фреймворком MVC и доступна для ряда объектов, в том числе для объекта ViewContext, который представляет контекст представления, в котором используется tag-хелпер.
Используем ViewContext, изменив код хелпера следующим образом:
using System; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; using TagHelpersApp.Services; // пространство имен сервиса ITimeService namespace TagHelpersApp.TagHelpers { public class TimerTagHelper : TagHelper { ITimeService timeService; [ViewContext] [HtmlAttributeNotBound] public ViewContext ViewContext { get; set; } public TimerTagHelper(ITimeService timeServ) { timeService = timeServ; } public override void Process(TagHelperContext context, TagHelperOutput output) { // получаем из строки запроса параметр font string font = ViewContext?.HttpContext.Request.Query["font"]; if (String.IsNullOrEmpty(font)) font = "Verdana"; output.Attributes.SetAttribute("style", $"font-family:{font};font-size:18px;"); output.TagName = "div"; output.TagMode = TagMode.StartTagAndEndTag; output.Content.SetContent($"Текущее время: {timeService.GetTime()}"); } } }
С помощью следующего свойства ViewContext мы автоматически получаем контекст представления, в котором вызывается хелпер:
[ViewContext] [HtmlAttributeNotBound] public ViewContext ViewContext { get; set; }
Чтобы автоматически получить данную зависимость, к свойству применяется атрибут [ViewContext]
.
Кроме того, здесь применяется атрибут HtmlAttributeNotBound. Так как по умолчанию публичные свойства tag-хелпера автоматически наполняются
через атрибуты элементов, то может возникнуть ситуация, что в представлении для данного элемента будет определен атрибут view-context
, например:
<timer view-context="@(new ViewContext())" />
Получив объект ViewContext, мы можем извлечь из него различную информацию. В частности, здесь получаем значение параметра font из строки запроса и это значение используем для установки шрифта элемента:
string font = ViewContext?.HttpContext.Request.Query["font"]; if (String.IsNullOrEmpty(font)) font = "Verdana"; output.Attributes.SetAttribute("style", $"font-family:{font};font-size:18px;");
Далее остается определить тег-хелпер в представлении:
<timer />
И при выполнении запроса тег-хелпер получит параметр font из стоки запроса (если он указан) и использует его для установки семейства шрифта: