ความแตกต่างระหว่าง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
หรือShortName
DisplayNameAttribute
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)