Создание и вызов TagHelpers вручную

Это следующий вопрос к этот вопрос, который, похоже, относится к более старой версии 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;

Но теперь содержимое пусто ...


person chakeda    schedule 07.02.2019    source источник


Ответы (1)


Привет, я проходил через это, и вы застряли в ViewContext и Output. Я сделал аналогичный проект. Вот код, надеюсь, он поможет.

[HtmlTargetElement(ParentAnchorTag)]
public class ParentActionTagHelper : TagHelper
{
    private const string ParentAnchorTag = "p-a";

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext viewContext { get; set; }

    private readonly IHtmlGenerator _htmlGenerator;

    public ParentActionTagHelper(IHtmlGenerator htmlGenerator)
    {
        _htmlGenerator = htmlGenerator;
    }
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";

        var anchorTagHelper = new AnchorTagHelper(_htmlGenerator)
        {
            Action = "Privacy",
            ViewContext = viewContext,

        };
        var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(),
            (useCachedResult, encoder) =>  Task.Factory.StartNew<TagHelperContent>(
                 () => new DefaultTagHelperContent()));
        anchorOutput.Content.AppendHtml("Privacy Link");
        var anchorContext = new TagHelperContext(
            new TagHelperAttributeList(new[]
            {
                new TagHelperAttribute("asp-action", new HtmlString("Privacy"))
            }),
                new Dictionary<object, object>(),
                Guid.NewGuid().ToString());

        anchorTagHelper.ProcessAsync(anchorContext, anchorOutput).GetAwaiter().GetResult();
        output.Content.SetHtmlContent(anchorOutput);
    }
}
person Himanshu Pant    schedule 06.07.2019