3

我有一个标签助手,如下所示:

[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 才能运行。* 在属性名称的末尾充当前缀匹配。

4

2 回答 2

8

您可以将“bar”从必需属性中删除。

您可以通过重写 Process 方法并检查属性是否存在来做到这一点。如果没有,请使用其名称和值添加 Bar 属性。您可以将值显式设置为,false但默认情况下属性 Bar 为 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

于 2016-01-18T00:06:42.717 回答
1

如果你不想检查可选属性是否在 Html 中明确指定,你可以检查context.AllAttributes,你不会像上一篇文章中output.Attributes指定的那样找到它。

我注意到如果我在 Html.xml 中保留(可选)属性,我的 TagHelper 不会被渲染OnlyUrlOfMenuItem。我只需要从上面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);
    }
于 2016-09-17T10:44:16.453 回答