如果我有以下标记助手:
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" />
那么,如何访问那些不是属性的属性?
答案 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)}/>");
}
}
}