标记助手中的可选属性

时间:2016-01-17 21:13:39

标签: asp.net-mvc razor asp.net-core-mvc tag-helpers

我有一个标签助手,沿着以下几行:

[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运行。 * 在......的最后   属性名称作为前缀匹配。

2 个答案:

答案 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);
    }