DisplayName-Attribute funktioniert nicht mehr: Neue DataAnnotations in ASP.NET Core

DisplayName-Attribute funktioniert nicht mehr: Neue DataAnnotations in ASP.NET Core

Im klassischen ASP.NET MVC Framework gibt es verschiedene DataAnnotation-Attribute für Models. So lassen sich beispielsweise die Anzeigenamen für Eigenschaften definieren. Hier verfolgt ASP.NET schon lange das DRY-Prinzip: Zum Model gehörende Validierungsdaten und Strings sollen möglichst auch im Model definiert werden. Dadurch stehen sie sowohl client- als auch serverseitig verfügbar, ohne diese jeweils doppelt definieren zu müssen.

Um Beispielsweise den Anzeigename in einem HTML-Formular zu definieren, wurde bislang das DisplayNameAttribute verwendet. Dies zeigt folgendes, an dieser Stelle bewusst sehr minimalistisch gehaltenes Beispiel:

public class User {
    [DisplayName("Benutzername")]
    public string UserName { get; set; }
}

In diesem Falle würde uns ASP.NET ein Textfeld generieren, dessen Label die Beschriftung Benutzername trägt. In ASP.NET Core ist dieses Attribute zwar noch vorhanden, funktioniert jedoch nicht mehr: Die Validierung wurde komplett überarbeitet und verzichtet großteils auf die Helferklassen. Anstelle dieser kommen nun HTML-Attribute mit dem asp- Präfix zum Einsatz, welche die Lesbarkeit erhöhen:

<label asp-for="UserName"></label>
<input asp-for="UserName" />

Diese übernehmen jedoch nicht die Eigenschaften des alten DisplayNameAttributes. Stattdessen gibt es ein neues DisplayAttribute, welches die Eigenschaft Name besitzt:

public class User {
    [Display(Name = "Benutzername")]
    public string UserName { get; set; }
}

Damit generiert uns ASP.NET Core wieder das vollständige HTML, in diesem Beispiel:

<label for="UserName">Benutzername</label>
<input name="UserName" id="UserName" />

Ansonsten kann natürlich der gewohnte Pool an Validierungs-Attributen genutzt werden, um Beispielsweise Limits oder Pflichtattribute zu nutzen:

public class User {
    [Required]
    [Display(Name = "Vorname")]
    [MinLength(5), MaxLength(50)]
    public string SureName { get; set; }
}

Leave a Reply