แอตทริบิวต์ชื่อที่แสดงเทียบกับแอตทริบิวต์ที่แสดง


คำตอบ:


69

ทั้งคู่ให้ผลลัพธ์เดียวกัน แต่ความแตกต่างที่สำคัญที่ฉันเห็นคือคุณไม่สามารถระบุResourceTypeในDisplayNameแอตทริบิวต์ ตัวอย่างเช่นใน MVC 2 คุณต้องซับคลาสDisplayNameแอตทริบิวต์เพื่อให้ทรัพยากรผ่านการแปล Displayแอตทริบิวต์ (ใหม่ใน MVC3 และ. NET4) รองรับการResourceTypeโอเวอร์โหลดเป็นคุณสมบัติ "นอกกรอบ"


1
ดีแล้วที่รู้! กำลังจะใช้แอตทริบิวต์ที่กำหนดเองเพื่อโหลดค่าที่แสดงจากไฟล์. resx ก็เกิดคำถามนี้ขึ้น แอตทริบิวต์การแสดงผลเป็นวิธีที่จะดำเนินการเมื่อพัฒนาแอปพลิเคชันที่แปลเป็นภาษาท้องถิ่น
Carl Heinrich Hancke

148

DisplayNameตั้งค่าDisplayNameในข้อมูลเมตาของโมเดล ตัวอย่างเช่น:

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

และหากคุณใช้ในมุมมองของคุณดังต่อไปนี้:

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

มันจะสร้าง:

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

Display ทำเช่นเดียวกัน แต่ยังช่วยให้คุณตั้งค่าคุณสมบัติข้อมูลเมตาอื่น ๆ เช่นชื่อคำอธิบาย ...

Brad Wilson มีบล็อกโพสต์ที่ดีซึ่งครอบคลุมคุณลักษณะเหล่านั้น


1
+1 - น่าจะเป็นประโยชน์มากกว่าของฉัน (ตอนนี้ถูกลบไปแล้ว); เช้าเกินไปสำหรับฉัน :)
Andras Zoltan

ฉันมีปัญหากับ PropertyDescriptor และใช้ Display (ชื่อ .. เมื่อเรียก @ descriptor.DisplayName มันจะใช้งานได้โดยใช้ DisplayName เท่านั้นไม่ใช่ Display (ชื่อ .. )
eaglei22

24

ฉันคิดว่าคำตอบในปัจจุบันละเลยที่จะเน้นถึงความแตกต่างที่สำคัญและมีนัยสำคัญที่แท้จริงและความหมายสำหรับการใช้งานที่ตั้งใจไว้ แม้ว่าทั้งคู่อาจทำงานในบางสถานการณ์เนื่องจากตัวดำเนินการสร้างขึ้นเพื่อรองรับทั้งสองอย่าง แต่ก็มีสถานการณ์การใช้งานที่แตกต่างกัน ทั้งสองสามารถใส่คำอธิบายประกอบคุณสมบัติและวิธีการได้ แต่ความแตกต่างที่สำคัญบางประการมีดังนี้

DisplayAttribute

  • กำหนดไว้ในSystem.ComponentModel.DataAnnotationsเนมสเปซในSystem.ComponentModel.DataAnnotations.dllแอสเซมบลี
  • สามารถใช้กับพารามิเตอร์และฟิลด์
  • ให้คุณตั้งค่าคุณสมบัติเพิ่มเติมเช่นDescriptionหรือShortName
  • สามารถแปลเป็นภาษาท้องถิ่นด้วยทรัพยากร

DisplayNameAttribute

  • DisplayName อยู่ในSystem.ComponentModelเนมสเปซในSystem.dll
  • สามารถใช้ในชั้นเรียนและกิจกรรมต่างๆ
  • ไม่สามารถแปลเป็นภาษาท้องถิ่นด้วยทรัพยากร

แอสเซมบลีและเนมสเปซพูดถึงการใช้งานที่ตั้งใจไว้และการรองรับการแปลเป็นตัวช่วยสำคัญ DisplayNameAttributeมีมาตั้งแต่. NET 2 และดูเหมือนว่าจะมีไว้สำหรับการตั้งชื่อส่วนประกอบของนักพัฒนาและคุณสมบัติในกริดคุณสมบัติเดิมไม่มากนักสำหรับสิ่งที่ผู้ใช้ปลายทางมองเห็นได้ซึ่งอาจต้องการการแปลและอื่น ๆ

DisplayAttributeได้รับการแนะนำในภายหลังใน. NET 4 และดูเหมือนว่าจะได้รับการออกแบบมาโดยเฉพาะสำหรับการติดฉลากสมาชิกของคลาสข้อมูลที่ผู้ใช้ปลายทางจะมองเห็นได้ดังนั้นจึงเหมาะสำหรับ DTO เอนทิตีและสิ่งอื่น ๆ ในประเภทนั้นมากกว่า ฉันคิดว่ามันค่อนข้างโชคร้ายที่พวกเขา จำกัด มันจึงไม่สามารถใช้กับชั้นเรียนได้

แก้ไข: ดูเหมือนว่าแหล่งที่มา. NET Core ล่าสุดอนุญาตให้DisplayAttributeใช้กับชั้นเรียนได้เช่นกัน


13

บางทีนี่อาจเป็นเฉพาะสำหรับ. 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.