Это следующий вопрос к этот вопрос, который, похоже, относится к более старой версии ASP.NET Core (я использую 2.1).
Я пытаюсь вызвать TagHelper вручную из TagHelper. Применяя ответ в связанном выше вопросе, TagHelper.Process выглядит так:
public override async void Process(TagHelperContext context, TagHelperOutput output)
{
var anchorTagHelper = new AnchorTagHelper
{
Action = "Home",
};
var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(), (useCachedResult, encoder) => new HtmlString());
var anchorContext = new TagHelperContext(
new TagHelperAttributeList(new[] { new TagHelperAttribute("asp-action", new HtmlString("Home")) }),
new Dictionary<object, object>(),
Guid.NewGuid());
await anchorTagHelper.ProcessAsync(anchorContext, anchorOutput);
output.Content.SetHtmlContent(anchorOutput);
}
На этом этапе происходит несколько ошибок компилятора.
не может преобразовать из System.Guid в строку
Нет проблем, я могу преобразовать в String.
Не указан аргумент, соответствующий 'значению' обязательного формального параметра 'HtmlString.HtmlString (строка).
Проверка страницы MSDN для TagHelperOutput, похоже, он больше не требует HtmlString
.
Я изменил этот аргумент на функцию делегата:
new TagHelperOutput("a", new TagHelperAttributeList(),
(useCachedResult, encoder) => Task.Factory.StartNew<TagHelperContent>(
() => new DefaultTagHelperContent()));
Последняя ошибка компилятора:
Не указан аргумент, соответствующий обязательному формальному параметру 'generator' AnchorTagHelper.AnchorTagHelper (IHtmlGenerator)
Надеясь, что это необязательный параметр, я передал null:
var anchorTagHelper = new AnchorTagHelper(null);
Наконец, он скомпилирован, но это привело к исключению нулевого указателя во время выполнения:
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper.Process (контекст TagHelperContext, вывод TagHelperOutput)
У меня такой вопрос: как создать экземпляр _ 5_, чтобы я мог вручную вызывать TagHelpers на C #?
РЕДАКТИРОВАТЬ: я DI'd IHtmlGenerator и получил более содержательное сообщение об ошибке:
private IHtmlGenerator htmlGenerator;
public myAnchorTagHelper(IHtmlGenerator htmlGenerator) {
this.htmlGenerator = htmlGenerator;
}
Значение не может быть нулевым. Имя параметра: viewContext>
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.GenerateActionLink (ViewContext viewContext, String linkText, String actionName, String controllerName, String protocol, String hostname, String fragment, Object routeValues, Object htmlAttributes) at Microsoft.AspNetCoreHelag.Tag.Tag. Обработать (контекст TagHelperOutput, вывод TagHelperOutput) в EAGLEweb2020.Models.EAGLEinputTagHelper.Process (контекст TagHelperContext, вывод TagHelperOutput) в C: \ Users \ 1135937 \ source \ repos \ EAGLEweb2020 \ EAGLEweb2020.sine Microsoft.AspNetCore.Razor.TagHelpers.TagHelper.ProcessAsync (контекст TagHelperContext, вывод TagHelperOutput) в Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.d__0.MoveNext ()
Но как я могу получить ViewContext?
ИЗМЕНИТЬ 2:
Оказывается, ViewContext является общедоступным свойством в AnchorTagHelper:
AnchorTagHelper inputTagHelper = new AnchorTagHelper(htmlGenerator);
inputTagHelper.ViewContext = viewContext;
Но теперь содержимое пусто ...