thuộc tính displayname vs thuộc tính display


Câu trả lời:


69

Cả hai đều cung cấp cho bạn kết quả tương tự nhưng sự khác biệt quan trọng nhất tôi thấy là bạn không thể xác định một ResourceTypetrong DisplayNamethuộc tính. Đối với một ví dụ trong MVC 2, bạn phải phân lớp DisplayNamethuộc tính để cung cấp tài nguyên thông qua nội địa hóa. Displaythuộc tính (mới trong MVC3 và .NET4) hỗ trợ ResourceTypequá tải như một thuộc tính "ngoài luồng ".


1
Tốt để biết! Đã sắp triển khai một thuộc tính tùy chỉnh để tải giá trị hiển thị từ tệp .resx, sau đó đã xảy ra với câu hỏi này. Hiển thị thuộc tính là cách để đi khi phát triển các ứng dụng cục bộ.
Carl Heinrich Hancke

148

DisplayNamethiết lập DisplayNamesiêu dữ liệu mô hình. Ví dụ:

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

và nếu bạn sử dụng theo quan điểm của bạn như sau:

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

nó sẽ tạo ra:

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

Display cũng làm như vậy, nhưng cũng cho phép bạn đặt các thuộc tính siêu dữ liệu khác như Tên, Mô tả, ...

Brad Wilson có một bài đăng blog tốt đẹp bao gồm các thuộc tính.


1
+1 - có lẽ hữu ích hơn nhiều so với của tôi (hiện đã bị xóa); quá sớm vào buổi sáng đối với tôi :)
Andras Zoltan

Tôi gặp vấn đề với PropertyDescriptor và sử dụng Display (tên .. khi gọi @ descriptor.DisplayName, nó sẽ chỉ hoạt động khi sử dụng DisplayName, không hiển thị (tên ..).
Eaglei22

24

Tôi nghĩ rằng các câu trả lời hiện tại đang bỏ qua để làm nổi bật sự khác biệt quan trọng và thực sự quan trọng và ý nghĩa của việc sử dụng dự định. Mặc dù cả hai có thể hoạt động trong một số trường hợp nhất định vì trình triển khai được hỗ trợ cho cả hai, nhưng chúng có các kịch bản sử dụng khác nhau. Cả hai đều có thể chú thích các thuộc tính và phương thức nhưng đây là một số khác biệt quan trọng:

DisplayAttribution

  • được định nghĩa trong System.ComponentModel.DataAnnotationsnamespace trong System.ComponentModel.DataAnnotations.dlllắp ráp
  • có thể được sử dụng trên các tham số và các trường
  • cho phép bạn đặt các thuộc tính bổ sung như DescriptionhoặcShortName
  • có thể được bản địa hóa với các tài nguyên

DisplayNameAttribution

  • DisplayName nằm trong System.ComponentModelkhông gian tên trongSystem.dll
  • có thể được sử dụng trên các lớp học và sự kiện
  • không thể được bản địa hóa với các tài nguyên

Việc lắp ráp và không gian tên nói lên mục đích sử dụng và hỗ trợ bản địa hóa là cú hích lớn. DisplayNameAttributeđã xuất hiện từ .NET 2 và dường như được dự định nhiều hơn cho việc đặt tên các thành phần và thuộc tính của nhà phát triển trong lưới thuộc tính kế thừa, không quá nhiều cho những thứ hiển thị cho người dùng cuối có thể cần bản địa hóa và như vậy.

DisplayAttributeđã được giới thiệu sau trong .NET 4 và dường như được thiết kế đặc biệt để gắn nhãn các thành viên của các lớp dữ liệu sẽ hiển thị cho người dùng cuối, vì vậy nó phù hợp hơn với các DTO, thực thể và những thứ khác thuộc loại đó. Tôi thấy khá đáng tiếc khi họ giới hạn nó vì vậy nó không thể được sử dụng trên các lớp học.

EDIT: Có vẻ như nguồn .NET Core mới nhất cũng cho phép DisplayAttributeđược sử dụng trên các lớp.


13

Có lẽ điều này là dành riêng cho lõi .net, tôi thấy DisplayName sẽ không hoạt động nhưng Display (Name = ...) thì có. Điều này có thể cứu người khác khắc phục sự cố liên quan :)

//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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.