Sự khác biệt giữa DisplayNamethuộc tính và Displaythuộc tính trong ASP.NET MVC là gì?
Sự khác biệt giữa DisplayNamethuộc tính và Displaythuộc tính trong ASP.NET MVC là gì?
Câu trả lời:
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 ".
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.
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
System.ComponentModel.DataAnnotationsnamespace trong System.ComponentModel.DataAnnotations.dlllắp rápDescriptionhoặcShortNameDisplayNameAttribution
System.ComponentModelkhông gian tên trongSystem.dllViệ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.
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)