asp.net核心标记帮助器,用于有条件地将类添加到元素

Moh*_*ari 7 tag-helpers asp.net-core

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

<div class="choice @(Model.Active?"active":"")">
</div>
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*ari 10

能够通过以下tagHelper提供添加条件css类.这个代码像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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@addTagHelper "*, WebApplication3"
Run Code Online (Sandbox Code Playgroud)

在视图中使用tagHelper:

<div condition-class-active="Model.Active" condition-class-show="Model.Display">
</div>
Run Code Online (Sandbox Code Playgroud)

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

<div class="active show">
</div>
Run Code Online (Sandbox Code Playgroud)