Необязательные атрибуты в вспомогательных функциях тегов

У меня есть помощник по тегам, который выглядит следующим образом:

[HtmlTargetElement("foo", Attributes = "bar")]
public class FooTagHelper : TagHelper

[HtmlAttributeName("bar")]
public bool Bar { get; set; }

Когда я добавляю следующее в представление, помощник тега обрабатывает цель, как и ожидалось:

<foo bar="true"></foo>

Однако я хотел бы сделать bar необязательным, например. <foo></foo> Если он был опущен, я бы хотел, чтобы по умолчанию было false

Это возможно? Этот комментарий к исходному коду для свойства HtmlTargetElementAttribute.Attributes, по-видимому, указывает на то, что нет:

// Сводка:
System.String с разделителями-запятыми, состоящая из имен атрибутов, которые HTML-элемент должен содержать
для запуска Microsoft.AspNet.Razor.TagHelpers.ITagHelper. * в конце имени атрибута действует как совпадение префикса.


person Mister Epic    schedule 17.01.2016    source источник


Ответы (2)


Вы можете удалить «бар» из обязательного атрибута.

Вы можете сделать это, переопределив метод Process и проверив, существует ли атрибут. Если это не так, добавьте атрибут Bar, используя его имя и значение. Вы можете явно установить значение false, но свойство Bar в любом случае по умолчанию равно false.

[HtmlTargetElement("foo")]
public class FooTagHelper : TagHelper
{
    [HtmlAttributeName("bar")]
    public bool Bar { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (!output.Attributes.ContainsName(nameof(Bar)))
        {
            output.Attributes.Add(nameof(Bar), Bar);
        }
    }
}

Ваше здоровье!

Если вы еще этого не сделали, я бы посоветовал взглянуть на документацию, доступную здесь https://docs.asp.net/projects/mvc/en/latest/views/tag-helpers/index.html.

person Mat Hellums    schedule 18.01.2016
comment
Помощник тега не будет обрабатывать полную остановку элемента recaptcha... Process() никогда не вызывается. - person Mister Epic; 19.01.2016
comment
Это должно работать нормально и превратило Bar в необязательный атрибут. Он отобразит <foo></foo> как <foo bar="False"></foo>. Возможно, есть еще одна проблема с помощником по тегам, который вы действительно используете? - person Daniel J.G.; 09.02.2016
comment
Когда я пробовал это, точка останова срабатывала только в том случае, если атрибут также был включен при использовании помощника тега. например используя ваш пример, это сработало бы, только если бы я использовал его так: ‹foo bar=›. Можно ли вообще не включать атрибут? - person Ciaran Gallagher; 03.02.2020

Если вы не хотите проверять, указан ли необязательный атрибут явно в Html, вы можете проверить context.AllAttributes, вы не найдете его в output.Attributes, как указано в предыдущем посте.

Я заметил, что мой TagHelper не отображался, если я пропустил (необязательный) атрибут OnlyUrlOfMenuItem в Html. Мне просто нужно было удалить атрибут OnlyUrlOfMenuItem из списка обязательных атрибутов HtmlTargetElement(), как указано Mat Hellums выше. Поскольку я не хочу, чтобы этот атрибут отображался в окончательном выводе, мне не нужно было добавлять атрибут с output.Attributes.Add(), как указано в предыдущем посте.

Вот мой код с необязательным атрибутом OnlyUrlOfMenuItem, который имеет значение по умолчанию false:

[HtmlTargetElement("a", Attributes = "MenuItem, LangCode")]
public class ATagHelper : TagHelper
{
    readonly IFhpMenuProvider _fhpMenuProvider;

    public ATagHelper(IFhpMenuProvider fhpMenuProvider)
    {
        _fhpMenuProvider = fhpMenuProvider;
        OnlyUrlOfMenuItem = false;
    }

    [HtmlAttributeName("LangCode")]
    public string LangCode { get; set; }

    [HtmlAttributeName("MenuItem")]
    public string MenuItemKey { get; set; }

    [HtmlAttributeName("OnlyUrlOfMenuItem")]
    public bool OnlyUrlOfMenuItem { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        MenuItem menuItem = _fhpMenuProvider.GetMenuItem(MenuItemKey, LangCode);
        if (menuItem != null)
        {
            ...
            if (string.IsNullOrEmpty(menuItem.Tooltip) == false && OnlyUrlOfMenuItem == false)
            {
                output.Attributes.SetAttribute("title", menuItem.Tooltip);
            }
            if (string.IsNullOrEmpty(menuItem.Caption) == false && OnlyUrlOfMenuItem == false)
            {
                output.Content.SetContent(menuItem.Caption);
            }
        }
        base.Process(context, output);
    }
person Erik Stroeken    schedule 17.09.2016