Sự khác biệt giữa DisplayName
thuộc tính và Display
thuộc tính trong ASP.NET MVC là gì?
Sự khác biệt giữa DisplayName
thuộc tính và Display
thuộ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 ResourceType
trong DisplayName
thuộc tính. Đối với một ví dụ trong MVC 2, bạn phải phân lớp DisplayName
thuộc tính để cung cấp tài nguyên thông qua nội địa hóa. Display
thuộc tính (mới trong MVC3 và .NET4) hỗ trợ ResourceType
quá tải như một thuộc tính "ngoài luồng ".
DisplayName
thiết lập DisplayName
siê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.DataAnnotations
namespace trong System.ComponentModel.DataAnnotations.dll
lắp rápDescription
hoặcShortName
DisplayNameAttribution
System.ComponentModel
không gian tên trongSystem.dll
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.
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)