Net Core: использовать Tag Helper в Custom Tag Helper, который возвращает HTML? - PullRequest
2 голосов
/ 06 июля 2019

Я пытаюсь задать этот вопрос, кроме как в .Net Core 2.

Могу ли я использовать Tag Helper в пользовательском Tag Helper, который возвращает html?

» Я хотел бы использовать помощник тега в помощнике тега. Я оглянулся и не смог найти никого другого, кто пытался бы это сделать, я использую плохое соглашение или мне не хватает документации?

Ex. Tag Helper A выводит HTML, содержащий другой помощник по тегам. "

Как мне исправить ошибку компиляции ниже?

[HtmlTargetElement("tag-name")]
public class RazorTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<a asp-action=\"Home\" ");
        output.Content.SetHtmlContent(sb.ToString());
    }
}

Есть ли способ обработать помощник по тегам из C #? Или обработать вывод HTML с помощью помощников тегов? «

Попробовал это помеченное Решение от Тейлора Маллена:

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);

Ошибка получения ниже

There is no argument given that corresponds to the required formal parameter 'value' of 'HtmlString.HtmlString(string)'

1 Ответ

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

Теперь это был один из моих любимых вопросов здесь. К счастью, я достаточно разобрался с помощниками тегов. Вот код.

[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);
    }
}

Во-первых, чтобы сгенерировать атрибут href с использованием имени действия, вам нужно имя действия, вам нужно предоставить ViewContext для AnchorTagHelper (в противном случае он выдаст ошибку), вы не можете внедрить это как зависимость. Строки 6-8 объясняют, что вам также нужен IHtmlGenerator, который вам нужно передать только конструктору AnchroTagHelper. Затем вы создаете контекст TagHelperOutput и TagHelperContext, необходимые для вызова метода processAsync для созданного вами помощника тега привязки. (Примечание. Я использую GetAwaiter (). GetResult (), поскольку в моем случае этот метод не является асинхронным, вы можете полностью поместить этот код в переопределенный метод ProcessAsync). Так что я помогаю решить эту проблему. Я проверил это, и оно работает.

Мой файл cshtml. enter image description here Мой вывод.

This is the output

...