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プロパティのソース コード コメントは、次のことを示していないようです。

// 概要: Microsoft.AspNet.Razor.TagHelpers.ITagHelper を実行するために
、HTML 要素に含める必要がある属性名のカンマ区切りの System.String 。
属性名の末尾にある * は、プレフィックス マッチとして機能します。

4

2 に答える 2

1

オプションの属性が Html で明示的に指定されているかどうかを確認したくない場合は、確認できます。前の投稿で指定されているcontext.AllAttributesように見つかりません。output.Attributes

Html で(オプションの) 属性を省略した場合、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 に答える