จะเปลี่ยนชื่อที่แสดงสำหรับ LabelFor ในมีดโกนใน mvc3 ได้อย่างไร?


87

ในเครื่องมือมีดโกนฉันใช้LabelForวิธีผู้ช่วยในการแสดงชื่อ

แต่ดูเหมือนว่าชื่อที่แสดงจะแสดงได้ไม่ดีนัก ต้องเปลี่ยนชื่อที่แสดงต้องทำยังไง ....

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

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

คำตอบ:


161

คุณสามารถตกแต่งคุณสมบัติโมเดลมุมมองของคุณด้วย[DisplayName]แอตทริบิวต์และระบุข้อความที่จะใช้:

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

หรือใช้ตัวช่วย LabelFor ที่มากเกินไปซึ่งช่วยให้คุณระบุข้อความ:

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

และไม่คุณไม่สามารถระบุชื่อคลาสใน MVC3 ได้ตามที่คุณพยายามทำเนื่องจากตัวLabelForช่วยไม่รองรับ อย่างไรก็ตามสิ่งนี้จะใช้ได้ใน MVC4 หรือ 5


@ raj2sekar1 หากใช้งานได้และคำตอบนี้ช่วยคุณแก้ปัญหาที่คุณพบคุณควรพิจารณาทำเครื่องหมายเป็นคำตอบโดยคลิกที่เครื่องหมายถูกที่อยู่ถัดจากนั้น: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
คุณต้องใช้ System.ComponentModel แม้ว่า
yancyn

2
สิ่งนี้มีประโยชน์ขอบคุณ แต่ฉันคิดว่าคำตอบของคุณจะดีกว่าถ้าคุณมีสิ่งนี้แทน@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
บางทีสิ่งนี้อาจเขียนไว้ก่อนหน้านี้ แต่ตอนนี้คุณสามารถระบุชื่อคลาสภายใน LabelFor: เช่น @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
แต่ถ้าคุณอัปเดตฐานข้อมูลคลาสโมเดลจะถูกสร้างใหม่และคุณจะสูญเสียสิ่งนี้ไป คุณจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร?
ชิม

30

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

คุณมี 3 ตัวเลือก:

  • เพิ่ม[DisplayName("Name goes here")]แอตทริบิวต์ให้กับคลาสโมเดลข้อมูล ข้อเสียคือสิ่งนี้จะถูกทิ้งเมื่อใดก็ตามที่คุณสร้างแบบจำลองข้อมูลใหม่
  • เพิ่มพารามิเตอร์สตริงลงในHtml.LabelForไฟล์. เช่น@Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})อ้างอิง: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspxข้อเสียคือคุณต้องทำซ้ำป้าย ในทุกมุมมอง
  • ตัวเลือกที่สาม ใช้คลาส meta-data ที่แนบมากับคลาสข้อมูล (รายละเอียดติดตาม)

ตัวเลือกที่ 3 - เพิ่มคลาส Meta-Data:

Microsoft อนุญาตให้ตกแต่งคุณสมบัติบนคลาส Entity Framework โดยไม่ต้องแก้ไขคลาสที่มีอยู่ ! โดยมีคลาส meta-data ที่แนบกับคลาสฐานข้อมูลของคุณ (เป็นส่วนขยายด้านข้างของคลาส EF ของคุณอย่างมีประสิทธิภาพ) สิ่งนี้อนุญาตให้เพิ่มแอตทริบิวต์ไปยังคลาสที่เกี่ยวข้องและไม่ใช่ในคลาสเองดังนั้นการเปลี่ยนแปลงจะไม่สูญหายไปเมื่อคุณสร้างโมเดลข้อมูลขึ้นมาใหม่

ตัวอย่างเช่นหากคลาสข้อมูลของคุณMyModelมีSomekingStatusคุณสมบัติคุณสามารถทำได้ดังนี้:

ก่อนอื่นให้ประกาศคลาสบางส่วนที่มีชื่อเดียวกัน (และใช้เนมสเปซเดียวกัน) ซึ่งช่วยให้คุณสามารถเพิ่มแอตทริบิวต์คลาสโดยไม่ถูกแทนที่:

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

คลาสโมเดลข้อมูลที่สร้างขึ้นทั้งหมดเป็นคลาสบางส่วนซึ่งช่วยให้คุณสามารถเพิ่มคุณสมบัติและเมธอดพิเศษได้โดยเพียงแค่สร้างคลาสที่มีชื่อเดียวกันมากขึ้น (สิ่งนี้มีประโยชน์มากและฉันมักจะใช้เช่นเพื่อจัดเตรียมเวอร์ชันสตริงที่จัดรูปแบบของฟิลด์ประเภทอื่นในโมเดล ).

ขั้นตอนที่ 2: เพิ่มคลาสข้อมูลเมตาที่อ้างอิงโดยคลาสบางส่วนใหม่ของคุณ:

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

อ้างอิง: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

หมายเหตุ:

  • จากหน่วยความจำหากคุณเริ่มใช้คลาสเมทาดาทาอาจละเว้นแอตทริบิวต์ที่มีอยู่บนคลาสจริง ( [required]ฯลฯ ) ดังนั้นคุณอาจต้องทำซ้ำสิ่งเหล่านั้นในคลาส Meta-data
  • สิ่งนี้ไม่ได้ทำงานด้วยเวทมนตร์และจะไม่ใช้กับคลาสใด ๆ เท่านั้น รหัสที่ค้นหาแอตทริบิวต์การตกแต่ง UI ได้รับการออกแบบมาเพื่อค้นหาคลาส meta-data ก่อน

มีสาเหตุใดบ้างที่ไม่สามารถใช้งานได้ใน ASP.NET Core 3.1? [จำเป็น] ใช้งานได้ แต่ไม่ใช่ [DisplayName ("my label")]
John Pasquet

15

คุณสามารถเปลี่ยนข้อความของป้ายกำกับได้โดยการตกแต่งคุณสมบัติด้วยDisplayNameแอตทริบิวต์

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

หรือคุณสามารถเขียน HTML ดิบอย่างชัดเจน:

<label for="SomekingStatus" class="control-label">Someking Status</label>

1
@shim: คุณไม่ควรทำงานโดยตรงกับคลาสโมเดลฐานข้อมูล / โดเมนในมุมมองของคุณโดยทั่วไปจะมีคลาส 'view-model' ตัวกลางอยู่ระหว่างนั้น
Vman

สิ่งที่ฉันกำลังมองหาอย่างยิ่งโดยใช้ไวยากรณ์ป้ายกำกับขอบคุณ @xander
Asif Iqbal

1
ปัญหาในการ "เขียน HTML แบบดิบอย่างชัดเจน" คือคุณจะต้องเขียนป้ายกำกับเองทุกครั้งที่ใช้แบบฟอร์มนั้น มันจะดีกว่าถ้าประกาศ de DisplayName บนโมเดล
Césarเลออน


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