atrybut displayname a atrybut display

Odpowiedzi:

71

Oba dają te same wyniki, ale widzę kluczową różnicę, że nie można określić atrybutu ResourceTypein DisplayName. Na przykład w MVC 2 należało DisplayNameutworzyć podklasę atrybutu, aby udostępnić zasób za pośrednictwem lokalizacji. Displayatrybut (nowy w MVC3 i .NET4) obsługuje ResourceTypeprzeciążenie jako właściwość „po wyjęciu z pudełka”.

Spock
źródło
1
Dobrze wiedzieć! Miałem zamiar zaimplementować niestandardowy atrybut, aby załadować wyświetlaną wartość z pliku resx, a potem wydarzyło się to w tej kwestii. Atrybut wyświetlania jest drogą do opracowania zlokalizowanych aplikacji.
Carl Heinrich Hancke
149

DisplayNameustawia DisplayNamemetadane w modelu. Na przykład:

[DisplayName("foo")]
public string MyProperty { get; set; }

a jeśli używasz w swojej opinii następujących informacji:

@Html.LabelFor(x => x.MyProperty)

wygenerowałoby:

<label for="MyProperty">foo</label>

Display robi to samo, ale umożliwia również ustawienie innych właściwości metadanych, takich jak nazwa, opis, ...

Brad Wilson ma fajny wpis na blogu dotyczący tych atrybutów.

Darin Dimitrov
źródło
1
+1 - prawdopodobnie znacznie bardziej pomocne niż moje (teraz usunięte); dla mnie za wcześnie rano :)
Andras Zoltan
Miałem problemy z PropertyDescriptor i używaniem Display (name .. podczas wywoływania @ descriptor.DisplayName, będzie działać tylko przy użyciu DisplayName, a nie Display (name ..).
eaglei 22
26

Myślę, że obecne odpowiedzi zaniedbują podkreślenie rzeczywistych ważnych i znaczących różnic oraz tego, co to oznacza dla zamierzonego zastosowania. Chociaż oba mogą działać w pewnych sytuacjach, ponieważ implementujący wbudował obsługę obu, mają różne scenariusze użycia. Oba mogą opisywać właściwości i metody, ale jest kilka ważnych różnic:

DisplayAttribute

  • zdefiniowane w System.ComponentModel.DataAnnotationsprzestrzeni nazw w System.ComponentModel.DataAnnotations.dllzestawie
  • może być używany na parametrach i polach
  • pozwala ustawić dodatkowe właściwości, takie jak DescriptionlubShortName
  • można zlokalizować za pomocą zasobów

DisplayNameAttribute

  • DisplayName znajduje się w System.ComponentModelprzestrzeni nazw w programieSystem.dll
  • może być używany na zajęciach i wydarzeniach
  • nie można zlokalizować za pomocą zasobów

Zespół i przestrzeń nazw mówią o zamierzonym użyciu, a obsługa lokalizacji jest wielkim kicker. DisplayNameAttributeistnieje od .NET 2 i wydaje się, że był przeznaczony bardziej do nazywania komponentów deweloperskich i właściwości w starszej siatce właściwości, a nie do rzeczy widocznych dla użytkowników końcowych, które mogą wymagać lokalizacji itp.

DisplayAttributezostał wprowadzony później w .NET 4 i wydaje się być zaprojektowany specjalnie do etykietowania elementów składowych klas danych, które będą widoczne dla użytkownika końcowego, więc jest bardziej odpowiedni dla DTO, jednostek i innych tego typu rzeczy. Uważam, że to raczej niefortunne, że ograniczyli go, więc nie można go używać na zajęciach.

EDYCJA: Wygląda na to, że najnowsze źródło .NET Core pozwala DisplayAttributeteraz również na użycie na zajęciach.

Mike Marynowski
źródło
14

Być może jest to specyficzne dla .net core, zauważyłem, że DisplayName nie działa, ale Display (Name = ...) działa. Może to uratować kogoś innego w rozwiązywaniu problemów :)

//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
źródło