Was ist der Unterschied zwischen DisplayNameAttribut und DisplayAttribut in ASP.NET MVC?
Was ist der Unterschied zwischen DisplayNameAttribut und DisplayAttribut in ASP.NET MVC?
Antworten:
Beide liefern die gleichen Ergebnisse, aber der Hauptunterschied, den ich sehe, besteht darin, dass Sie kein ResourceTypein- DisplayNameAttribut angeben können . In einem Beispiel in MVC 2 mussten Sie das DisplayNameAttribut in Unterklassen unterteilen , um Ressourcen über die Lokalisierung bereitzustellen. DisplayDas Attribut (neu in MVC3 und .NET4) unterstützt die ResourceTypeÜberladung als "out of the box" -Eigenschaft .
DisplayNameLegt die DisplayNameim Modell enthaltenen Metadaten fest. Beispielsweise:
[DisplayName("foo")]
public string MyProperty { get; set; }
und wenn Sie aus Ihrer Sicht Folgendes verwenden:
@Html.LabelFor(x => x.MyProperty)
es würde erzeugen:
<label for="MyProperty">foo</label>
Display macht das gleiche, aber Sie können auch andere Metadateneigenschaften wie Name, Beschreibung, ... festlegen.
Brad Wilson hat einen schönen Blog-Beitrag über diese Attribute.
Ich denke, die aktuellen Antworten vernachlässigen es, die tatsächlich wichtigen und signifikanten Unterschiede hervorzuheben und was dies für die beabsichtigte Verwendung bedeutet. Während beide in bestimmten Situationen funktionieren können, weil der Implementierer Unterstützung für beide integriert hat, haben sie unterschiedliche Verwendungsszenarien. Beide können Eigenschaften und Methoden mit Anmerkungen versehen, aber hier sind einige wichtige Unterschiede:
DisplayAttribute
System.ComponentModel.DataAnnotationsNamespace in der System.ComponentModel.DataAnnotations.dllAssembly definiertDescriptionoder festlegenShortNameDisplayNameAttribute
System.ComponentModelNamespace inSystem.dllDie Assembly und der Namespace sprechen für die beabsichtigte Verwendung, und die Lokalisierungsunterstützung ist der große Kicker. DisplayNameAttributegibt es seit .NET 2 und scheint eher für die Benennung von Entwicklerkomponenten und -eigenschaften im Legacy-Eigenschaftenraster gedacht zu sein, nicht so sehr für Dinge, die für Endbenutzer sichtbar sind, die möglicherweise eine Lokalisierung und dergleichen benötigen.
DisplayAttributewurde später in .NET 4 eingeführt und scheint speziell für die Kennzeichnung von Mitgliedern von Datenklassen entwickelt worden zu sein, die für den Endbenutzer sichtbar sind. Daher eignet es sich besser für DTOs, Entitäten und andere Dinge dieser Art. Ich finde es ziemlich bedauerlich, dass sie es eingeschränkt haben, so dass es nicht für Klassen verwendet werden kann.
BEARBEITEN: Es sieht so aus, als ob die neueste .NET Core-Quelle DisplayAttributejetzt auch für Klassen verwendet werden kann.
Vielleicht ist dies spezifisch für den .net-Kern. Ich habe festgestellt, dass DisplayName nicht funktioniert, Display (Name = ...) jedoch. Dies kann jemand anderem die Fehlerbehebung ersparen :)
//using statements
using System;
using System.ComponentModel.DataAnnotations; //needed for Display annotation
using System.ComponentModel; //needed for DisplayName annotation
public class Whatever
{
//Property
[Display(Name ="Release Date")]
public DateTime ReleaseDate { get; set; }
}
//cshtml file
@Html.DisplayNameFor(model => model.ReleaseDate)