从标记帮助器中,如何访问不是标记帮助器属性的属性?

时间:2019-10-10 16:31:20

标签: c# asp.net model-view-controller tag-helpers asp.net-core-tag-helpers

如果我有以下标记助手:

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" />

那么,如何访问那些不是属性的属性?

1 个答案:

答案 0 :(得分:0)

我偶然发现了自己的问题的答案。

传递给名为Process的方法的名为 context 的参数包含属性 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)}/>");
        }  
    }  
}