Это дополнительный вопрос к этому вопросу , который, по-видимому, относится к более старой версии 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.
Не указан аргумент, соответствующий необходимому формальному параметру 'value' из 'HtmlString.HtmlString (string)
Проверка страницы MSDN для Конструктор TagHelperOutput , похоже, он больше не занимает HtmlString
.
Я изменил этот аргумент на функцию делегата:
new TagHelperOutput("a", new TagHelperAttributeList(),
(useCachedResult, encoder) => Task.Factory.StartNew<TagHelperContent>(
() => new DefaultTagHelperContent()));
Последняя ошибка компилятора:
Нет аргумента, соответствующего необходимому формальному параметру'generator' of 'AnchorTagHelper.AnchorTagHelper (IHtmlGenerator)
Надеясь на необязательный параметр, я передал значение NULL:
var anchorTagHelper = new AnchorTagHelper(null);
Наконец, оно скомпилировано - но это привелоисключение нулевого указателя во время выполнения:
Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper.Process (контекст TagHelperContext, вывод TagHelperOutput)
Мой вопрос таков: какмогу ли я создать экземпляр AnchorTagHelper
, чтобы я мог вручную вызывать TagHelpers в C #?
EDIT : Я DI'd IHtmlGenerator и получил более значимое сообщение об ошибке:
private IHtmlGenerator htmlGenerator;
public myAnchorTagHelper(IHtmlGenerator htmlGenerator) {
this.htmlGenerator = htmlGenerator;
}
Значение не может быть нулевым.Имя параметра: viewContext>
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.GenerateActionLink (ViewContext viewContext, String linkText, строковое actionName, строковое controllerName, строковый протокол, строковое имя хоста, строковый фрагмент, объектный объектный объект).в Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper.Process (TagHelperContext контексте вывода TagHelperOutput) в EAGLEweb2020.Models.EAGLEinputTagHelper.Process (TagHelperContext контексте вывода TagHelperOutput) в C: \ Users \ 1135937 \ Source \ Repos \ EAGLEweb2020 \ EAGLEweb2020 \Models \ TagHelpers \ EAGLEinputTagHelper.cs: строка 66 в Microsoft.AspNetCore.Razor.TagHelpers.TagHelper.ProcessAsync (контекст TagHelperContext, выходные данные TagHelperOutput) в Microsoft.AspNetCore.Razor.Runor.Runtime.TagHelper.
Но как я могу DI ViewContext?
РЕДАКТИРОВАТЬ 2:
Оказывается, ViewContext является публичным свойством в AnchorTagHelper:
AnchorTagHelper inputTagHelper = new AnchorTagHelper(htmlGenerator);
inputTagHelper.ViewContext = viewContext;
Но теперь содержимое пусто ...