Anzeigenamenattribut vs Anzeigeattribut

Antworten:

69

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 .

Spock
quelle
1
Gut zu wissen! Wollte ein benutzerdefiniertes Attribut implementieren, um den Anzeigewert aus der .resx-Datei zu laden, dann passierte diese Frage. Das Anzeigeattribut ist der richtige Weg, wenn Sie lokalisierte Anwendungen entwickeln.
Carl Heinrich Hancke
148

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.

Darin Dimitrov
quelle
1
+1 - wahrscheinlich viel hilfreicher als meine (jetzt gelöscht); zu früh am Morgen für mich :)
Andras Zoltan
Ich hatte Probleme mit PropertyDescriptor und der Verwendung von Display (Name .. beim Aufrufen von @ Descriptor.DisplayName, es funktioniert nur mit DisplayName, nicht Display (Name ..).
eaglei22
23

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

  • im System.ComponentModel.DataAnnotationsNamespace in der System.ComponentModel.DataAnnotations.dllAssembly definiert
  • kann für Parameter und Felder verwendet werden
  • Mit dieser Option können Sie zusätzliche Eigenschaften wie Descriptionoder festlegenShortName
  • kann mit Ressourcen lokalisiert werden

DisplayNameAttribute

  • DisplayName befindet sich im System.ComponentModelNamespace inSystem.dll
  • kann für Klassen und Veranstaltungen verwendet werden
  • kann nicht mit Ressourcen lokalisiert werden

Die 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.

Mike Marynowski
quelle
13

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)
mattpm
quelle