Создание и вызов TagHelpers вручную - PullRequest
0 голосов
/ 08 февраля 2019

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

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

1 Ответ

0 голосов
/ 06 июля 2019

Привет, я проходил через это, и вы застряли в 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);
    }
}
...