Как я могу получить доступ к атрибутам, не являющимся свойствами вспомогательной функции тега, изнутри помощника тега?

Если у меня есть следующий помощник тега:

using Microsoft.AspNetCore.Razor.TagHelpers;  

namespace CustomTagHelper.TagHelpers  
{  
    [HtmlTargetElement("my-first-tag-helper")]  
    public class MyCustomTagHelper : TagHelper  
    {  
        public string Id { get; set; }
        public string Type { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)  
        {  

            output.SuppressOutput();
            output.Content.Clear();

            output.Content.SetHtmlContent($"<input id={Id} type={Type} />");  
        }  
    }  
}  

и в представлении я передаю это:

<my-first-tag-helper id="my-input" type="text" placeholder="type anything you want" autocomplete="off" disabled="disabled" />

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

В предыдущем примере результирующий тег должен быть:

<input id="my-input" type="text" placeholder="type anything you want" autocomplete="off" disabled="disabled" />

Итак, как мне получить доступ к тем атрибутам, которые не являются свойствами?


person Joe Salazar    schedule 10.10.2019    source источник


Ответы (1)


Я просто наткнулся на ответ на свой вопрос.

Параметр с именем context, который передается методу с именем Process, содержит свойство AllAttributes, которое, как следует из названия, содержит все атрибуты, которые были переданы независимо от того, существуют ли они как свойство или нет. Затем вы просто отфильтровываете существующие свойства, а затем создаете атрибуты, которые остались в списке.

Вот как выглядит решение:

using Microsoft.AspNetCore.Razor.TagHelpers;  
using System.Collections.Generic;
using System.Linq;

namespace CustomTagHelper.TagHelpers  
{  
    [HtmlTargetElement("my-first-tag-helper")]  
    public class MyCustomTagHelper : TagHelper  
    {  
        public string Id { get; set; }
        public string Type { get; set; }

        public override void Process(TagHelperContext context, TagHelperOutput output)  
        {  
            output.SuppressOutput();
            output.Content.Clear();

            // ------------------- Begin Extra Attributes --------------------

            var attributeObjects = context.AllAttributes.ToList();

            var props = this.GetType().GetProperties().Select(p => p.Name);

            attributeObjects.RemoveAll(a => props.Contains(a.Name));

            var extraAttributeList = new List<string>();

            foreach (var attr in attributeObjects)
            {
                extraAttributeList.Add($"{attr.Name}=\"{attr.Value}\"");
            }                                                                                                 

            // ------------------- End Extra Attributes --------------------

            output.Content.SetHtmlContent($"<input id={Id} type={Type} {string.Join(" ", extraAttributeList)}/>");
        }  
    }  
}  
person Joe Salazar    schedule 21.10.2019