ความแตกต่างระหว่างDisplayNameแอตทริบิวต์และDisplayแอตทริบิวต์ใน ASP.NET MVC คืออะไร?
ความแตกต่างระหว่างDisplayNameแอตทริบิวต์และDisplayแอตทริบิวต์ใน ASP.NET MVC คืออะไร?
คำตอบ:
ทั้งคู่ให้ผลลัพธ์เดียวกัน แต่ความแตกต่างที่สำคัญที่ฉันเห็นคือคุณไม่สามารถระบุResourceTypeในDisplayNameแอตทริบิวต์ ตัวอย่างเช่นใน MVC 2 คุณต้องซับคลาสDisplayNameแอตทริบิวต์เพื่อให้ทรัพยากรผ่านการแปล Displayแอตทริบิวต์ (ใหม่ใน MVC3 และ. NET4) รองรับการResourceTypeโอเวอร์โหลดเป็นคุณสมบัติ "นอกกรอบ"
DisplayNameตั้งค่าDisplayNameในข้อมูลเมตาของโมเดล ตัวอย่างเช่น:
[DisplayName("foo")]
public string MyProperty { get; set; }
และหากคุณใช้ในมุมมองของคุณดังต่อไปนี้:
@Html.LabelFor(x => x.MyProperty)
มันจะสร้าง:
<label for="MyProperty">foo</label>
Display ทำเช่นเดียวกัน แต่ยังช่วยให้คุณตั้งค่าคุณสมบัติข้อมูลเมตาอื่น ๆ เช่นชื่อคำอธิบาย ...
Brad Wilson มีบล็อกโพสต์ที่ดีซึ่งครอบคลุมคุณลักษณะเหล่านั้น
ฉันคิดว่าคำตอบในปัจจุบันละเลยที่จะเน้นถึงความแตกต่างที่สำคัญและมีนัยสำคัญที่แท้จริงและความหมายสำหรับการใช้งานที่ตั้งใจไว้ แม้ว่าทั้งคู่อาจทำงานในบางสถานการณ์เนื่องจากตัวดำเนินการสร้างขึ้นเพื่อรองรับทั้งสองอย่าง แต่ก็มีสถานการณ์การใช้งานที่แตกต่างกัน ทั้งสองสามารถใส่คำอธิบายประกอบคุณสมบัติและวิธีการได้ แต่ความแตกต่างที่สำคัญบางประการมีดังนี้
DisplayAttribute
System.ComponentModel.DataAnnotationsเนมสเปซในSystem.ComponentModel.DataAnnotations.dllแอสเซมบลีDescriptionหรือShortNameDisplayNameAttribute
System.ComponentModelเนมสเปซในSystem.dllแอสเซมบลีและเนมสเปซพูดถึงการใช้งานที่ตั้งใจไว้และการรองรับการแปลเป็นตัวช่วยสำคัญ DisplayNameAttributeมีมาตั้งแต่. NET 2 และดูเหมือนว่าจะมีไว้สำหรับการตั้งชื่อส่วนประกอบของนักพัฒนาและคุณสมบัติในกริดคุณสมบัติเดิมไม่มากนักสำหรับสิ่งที่ผู้ใช้ปลายทางมองเห็นได้ซึ่งอาจต้องการการแปลและอื่น ๆ
DisplayAttributeได้รับการแนะนำในภายหลังใน. NET 4 และดูเหมือนว่าจะได้รับการออกแบบมาโดยเฉพาะสำหรับการติดฉลากสมาชิกของคลาสข้อมูลที่ผู้ใช้ปลายทางจะมองเห็นได้ดังนั้นจึงเหมาะสำหรับ DTO เอนทิตีและสิ่งอื่น ๆ ในประเภทนั้นมากกว่า ฉันคิดว่ามันค่อนข้างโชคร้ายที่พวกเขา จำกัด มันจึงไม่สามารถใช้กับชั้นเรียนได้
แก้ไข: ดูเหมือนว่าแหล่งที่มา. NET Core ล่าสุดอนุญาตให้DisplayAttributeใช้กับชั้นเรียนได้เช่นกัน
บางทีนี่อาจเป็นเฉพาะสำหรับ. net core ฉันพบว่า DisplayName ไม่ทำงาน แต่ Display (Name = ... ) ทำ สิ่งนี้อาจช่วยคนอื่นในการแก้ไขปัญหาที่เกี่ยวข้อง :)
//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)