TagHelper PreContent и PostContent не отображаются в HTML при переопределении InputTagHelper - PullRequest
0 голосов
/ 26 мая 2019

Я хочу создать помощник по тегам, чтобы поместить HTML до и после тегов <input>, но я хочу сохранить поведение по умолчанию asp-for и получить доступ к данным ModelExpression.

С этой целью я попытался переопределить тип Microsoft.AspNetCore.Mvc.TagHelpers.InputTagHelper, как описано в этом посте . Однако, несмотря на то, что я могу проверить в отладчике, что вызывается метод Process, PreContent и PostContent оба установлены, в HTML ничего не отображается, кроме стандартного тега <input>. Хотя он отлично работает при создании вспомогательного тега с нуля для другого тега.

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

    [HtmlTargetElement("input", Attributes = "asp-for,test-label")]
    public class TestTagHelper : InputTagHelper
    {
        public TestTagHelper(IHtmlGenerator generator) : base(generator)
        {
        }

        [HtmlAttributeName("test-label")]
        public string Label { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.PreContent.SetHtmlContent($"<b>{WebUtility.HtmlEncode(Label)}</b> ");
            output.PostContent.SetHtmlContent($" <i>({WebUtility.HtmlEncode(For.Name)})</i>"); // access information from the input tag
            base.Process(context, output);
        }
    }

Я что-то упускаю из виду? Есть ли здесь предостережение? Или это то, что просто невозможно сделать?

1 Ответ

1 голос
/ 28 мая 2019

Для этой проблемы мы могли бы попытаться вызвать PreElement и PostElement вместо PreContent и PostContent как

[HtmlTargetElement("input", Attributes = "asp-for,test-label")]
public class TestTagHelper : InputTagHelper
{
    public TestTagHelper(IHtmlGenerator generator) : base(generator)
    {
    }

    [HtmlAttributeName("test-label")]
    public string Label { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        base.Process(context, output);
        output.PreElement.SetHtmlContent($"<b>{WebUtility.HtmlEncode(Label)}</b>");
        output.PostElement.SetHtmlContent($"<i>({WebUtility.HtmlEncode(For.Name)})</i>");
    }
}
...