我有一个标签助手,沿着以下几行:
[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
属性的源代码注释似乎表示不是:
//摘要:
HTML元素必须包含的属性名称的逗号分隔System.String 为Microsoft.AspNet.Razor.TagHelpers.ITagHelper运行。 * 在......的最后 属性名称作为前缀匹配。
答案 0 :(得分:6)
您可以删除“bar”作为必需属性。
您可以通过重写Process方法并检查属性是否存在来实现。如果没有,请使用其名称和值添加Bar属性。您可以将值显式设置为false
,但默认情况下属性栏仍为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。
答案 1 :(得分:0)
如果您不想检查Html中是否明确指定了可选属性,则可以检查context.AllAttributes
,但您无法在output.Attributes
中找到它上一篇文章。
如果我在Html中遗漏了(可选)属性OnlyUrlOfMenuItem
,我注意到我的TagHelper没有被渲染。我只需要从上面的Mat Hellums所述的必需属性OnlyUrlOfMenuItem
列表中删除属性HtmlTargetElement()
。由于我不希望此属性显示在最终输出中,因此我不需要使用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);
}