Neues in ASP.NET 5, Teil 1: Tag Helper

Seite 2: Vielerlei Tag Helper

Inhaltsverzeichnis

Der Tag Helper <DateTime> hat das Tag und den Inhalt komplett ausgetauscht. Oft wollen Entwickler aber auch den Inhalt weiterverwenden. So könnten sie ein <Textbox>-Tag erfinden:

<textbox size="50">Ihr Name:</textbox>

Die Ausgabe soll

<div><label>Ihr Name:</label><input type='textbox'
size='50'></div>

sein. Eine Möglichkeit zur Realisierung ist die Verwendung der Eigenschaften PreContent und PostContent, mit denen Entwickler festlegen können, was vor beziehungsweise nach dem bisherigen Inhalt ausgegeben werden soll. Den Tag-Namen dürfen sie auf eine leere Zeichenkette setzen, wenn der Inhalt aus einer Folge mehrerer Tags besteht.

public class TextboxTagHelper : TagHelper
{
[HtmlAttributeName("asp-size")]
public string Size { get; set; }

public override void Process(TagHelperContext context,
TagHelperOutput output)
{
output.TagName = "";
output.PreContent = "<div><label>";
output.PostContent = "</label>" +
"<input type='textbox' size='" + Size + "'></div>";
}
}

PreContent und [/i]PostContent[/i] reichen aber nicht immer. Man stelle sich vor, dass man den Inhalt der <textbox>-Tags nicht nur als Bezeichnungstext, sondern auch zusätzlich noch im Platzhalterattribut des <input>-Tags verwenden will. So eine Doppelverwendung geht mit PreContent und PostContent gar nicht.

Den bisherigen Inhalt eines eigenen Tags auszulesen, erlaubt Microsoft nur asynchron mit der Methode context.GetChildContentAsync(). Damit Entwickler sie verwenden können, müssen sie anstelle der Methode Process() die asynchrone Variante ProcessAsync() in der Tag-Helper-Klasse implementieren. Das folgende Listing zeigt die Neufassung, die den bisherigen Inhalt ausliest und zweimal in der Ausgabe (in <label> und in <input>) verwendet.

public class TextboxTagHelper : TagHelper
{
[HtmlAttributeName("size")]
public string Size { get; set; }

public override async Task ProcessAsync(TagHelperContext context,
TagHelperOutput output)
{
var inhalt = await context.GetChildContentAsync();
output.TagName = "";
output.Content = "<div><label>" + inhalt + "</label>" +
"<input type='textbox' size='" + Size + "' placeholder='"
+ inhalt + "'></div>";
}
}

Tag-Helper-Klassen können sich auch auf Standard-HTML-Tags beziehen und diese modifizieren, zum Beispiel neue HTML-Attribute ergänzen. Microsoft liefert eine Reihe von Tag Helpers mit, zum Beispiel sorgt die Klasse AnchorTagHelper dafür, dass die Attribute asp-controller und asp-action in einem <a>-Tag zum href-Attribut umgewandelt werden. Aus

<a asp-controller="Flug" asp-action="Buchen">Link zur Buchungsseite </a> 

wird dann

<a href="/Flug/Buchen">Link zur Buchungsseite</a>

Die bisherige Unterstützung für die Link-Erzeugung in ASP.NET MVC sah so aus:

@Html.ActionLink("Link zur Buchungsseite", "Buchen", "Flug")

Das nennt Microsoft einen HTML Helper. Ihn findet man in ASP.NET MVC 6 weiterhin. Andere Tag Helper dieser Art gibt es für die Standard-HTML-Tags <form>, <label>, <input>, <select>, <script> und <link>. Nach einiger Diskussion hat sich Microsoft entschlossen, für die Attribute der mitgelieferten Tag Helpers, die ein Standard-HTML-Tag erweitern, das Präfix "asp-" für alle Erweiterungsattribute zu verwenden. Das ist aber nicht Pflicht für eigene Tag Helpers. Auch Microsoft wendet das Präfix nicht bei Tag-Namen, die es in Standard-HTML nicht gibt. Beispiele für solche eingebauten Tag Helper sind <environment> (Inhalte rendern abhängig vom Wert der Umgebungsvariablen ASPNET_ENV) und <cache> (Inhalte für eine bestimmte Dauer zwischenspeichern).