Почему TagHelper HtmlAttributeName не разрешен в ASP.NET Core 2.2 - PullRequest
0 голосов
/ 03 апреля 2019

Я работаю над пользовательским TagHelper, для которого я использовал пример из Microsoft .

public class EmailTagHelper : TagHelper
{
    private const string EmailDomain = "contoso.com";

    // Can be passed via <email mail-to="..." />. 
    // PascalCase gets translated into kebab-case.
    [HtmlAttributeName("mail-to")]
    public string MailTo { get; set; }

    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "a";                                 // Replaces <email> with <a> tag
        var content = await output.GetChildContentAsync();
        var target = content.GetContent() + "@" + EmailDomain;
        output.Attributes.SetAttribute("href", "mailto:" + target);

        output.Content.SetContent(target);
    }
}

Я использовал его с этими примерами:

<email>Support</email>
<email mail-to="Support"></email>

Первый пример работает, как ожидалось, и дает следующий вывод:

<a href="mailto:Support@contoso.com">Support@contoso.com</a>

Но второй пример, где используется mail-to HtmlAttributeName, не разрешен, как показано ниже.

<a href="mailto:@contoso.com">@contoso.com</a>

Это заняло у меня весь день, и я, вероятно, потом буду биться головой, но может кто-нибудь сказать мне, почему это не работает?

1 Ответ

0 голосов
/ 03 апреля 2019

Вы объявили MailTo и связали его с атрибутом mail-to, но вы не используете MailTo в ProcessAsync.Вместо этого вы всегда используете метод GetChildContentAsync() для получения контента.

Вам нужно будет принять решение о том, какой приоритет имеет приоритет или вы хотите создать какой-то видисключение, если указаны и mail-to, и содержимое, и т. д. Вот примерный пример, который предпочитает атрибут для полноты:

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
    output.TagName = "a";

    var mailTo = MailTo;

    if (string.IsNullOrWhiteSpace(mailTo))
    {
        var content = await output.GetChildContentAsync();
        mailTo = content.GetContent();
    }

    var target = mailTo + "@" + EmailDomain;
    output.Attributes.SetAttribute("href", "mailto:" + target);

    output.Content.SetContent(target);
}
...