ASP.NET 核心标签助手,用于有条件地向元素添加 class

ASP.NET Core tag helper for conditionally adding a class to an element

在Asp.Net MVC中我们可以有条件地添加class如下代码:

<div class="choice @(Model.Active?"active":"")">
</div>

如何通过使用 tagHelper 并删除条件中的其他部分来做到这一点。

没有默认方法可以完成您的要求。您将不得不编写一个 TagHelper 来为您执行该逻辑。阿卡

[HtmlTargetElement(Attributes = "asp-active")]
public class FooTagHelper : TagHelper
{
    [HtmlAttributeName("asp-active")]
    public bool Active { get; set; }

    public override void Process(TagHelperOutput output, TagHelperContext context)
    {
        if (Active)
        {
            // Merge your active class attribute onto "output"'s attributes.
        }
    }
}

然后 HTML 看起来像:

<div class="choice" asp-active="Model.Active"></div>

能够按照 tagHelper 提供的条件添加条件 css class。 此代码类似于 AnchorTagHelper asp-route-* 用于添加路由值行为。

[HtmlTargetElement("div", Attributes = ClassPrefix + "*")]
public class ConditionClassTagHelper : TagHelper
{
    private const string ClassPrefix = "condition-class-";

    [HtmlAttributeName("class")]
    public string CssClass { get; set; }

    private IDictionary<string, bool> _classValues;

    [HtmlAttributeName("", DictionaryAttributePrefix = ClassPrefix)]
    public IDictionary<string, bool> ClassValues
    {
        get {
            return _classValues ?? (_classValues = 
                new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase));
        }
        set{ _classValues = value; }
    }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        var items = _classValues.Where(e => e.Value).Select(e=>e.Key).ToList();

        if (!string.IsNullOrEmpty(CssClass))
        {
            items.Insert(0, CssClass);
        }

        if (items.Any())
        {
            var classes = string.Join(" ", items.ToArray());
            output.Attributes.Add("class", classes);
        }
    }
}

在 _ViewImports.cshtml 中添加对 taghelper 的引用如下

@addTagHelper "*, WebApplication3"

在视图中使用 tagHelper:

<div condition-class-active="Model.Active" condition-class-show="Model.Display">
</div>

Active = true 和 Display = true 的结果是:

<div class="active show">
</div>