2017-02-20 21 views

Antwort

5

Fähigkeit, eine bedingte CSS-Klasse hinzufügen, indem Sie folgende tagHelper zur Verfügung stellt. dieser Code wie AnchorTagHelper asp-route- * zum Hinzufügen von Routenwerten.

[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); 
     } 
    } 
} 

in _ViewImports.cshtml Referenz hinzufügen, wie folgende

@addTagHelper "*, WebApplication3" 

Verwenden tagHelper in Aussicht taghelper:

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

Ergebnis für Active = true und Anzeige = true ist:

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

ist es möglich, Suffixe zu verwenden, nicht nur Pref ixes? sag 'klasse - * - if'? – Serge

+0

@Serge Aus der Inline-Dokumentation kann das * nur am Ende erscheinen. So ist es heute wahrscheinlich nicht möglich. – ygoe

+0

Wenn ich den obigen Code mit dem Beispiel verwende, rendert es '

' – mheptinstall

2

Es gibt keine Standardmethode, um das zu tun, was Sie fragen. Du müsstest einen TagHelper schreiben, der diese Logik für dich erledigt hat.

Aka
[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. 
     } 
    } 
} 

Und dann die HTML würde wie folgt aussehen:

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