Mvc3 में रेजर में LabelFor के लिए प्रदर्शन नाम कैसे बदलें?


87

रेजर इंजन में मैंने LabelForनाम प्रदर्शित करने के लिए सहायक विधि का उपयोग किया है

लेकिन ऐसा लगता है कि प्रदर्शन नाम प्रदर्शित करने के लिए अच्छा नहीं है। इसलिए मुझे अपना प्रदर्शन नाम बदलने की आवश्यकता है कि यह कैसे करना है ...।

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

यह एक बहुत पुराना प्रश्न है, लेकिन फिर भी वर्तमान MVC कोडिंग के लिए बहुत प्रासंगिक है। अब तक प्रदान किए गए दो समाधानों के साथ समस्याएं हैं, इसलिए मैंने आपके लिए उपलब्ध सभी 3 विकल्पों को कवर करते हुए अधिक विस्तृत उत्तर जोड़ा है ।
कोडिंग

जवाबों:


160

आप अपने दृश्य मॉडल गुण को [DisplayName]विशेषता के साथ सजा सकते हैं और उपयोग किए जाने वाले पाठ को निर्दिष्ट कर सकते हैं:

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

या लेबलफ़ोर हेल्पर के एक और अधिभार का उपयोग करें जो आपको पाठ निर्दिष्ट करने की अनुमति देता है:

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

और, नहीं, आप MVC3 में एक वर्ग का नाम निर्दिष्ट नहीं कर सकते हैं जैसा कि आपने करने की कोशिश की, क्योंकि LabelForसहायक इसका समर्थन नहीं करता है। हालाँकि, यह MVC4 या 5 में काम करेगा।


@ raj2sekar1, यदि यह काम कर रहा है और इस जवाब से आपको उस समस्या को हल करने में मदद मिली, जो आप कर रहे थे, तो आपको इसके बगल में टिक पर क्लिक करके उत्तर के रूप में चिह्नित करने पर विचार करना चाहिए: meta.stackexchange.com/questions/5234-…
डारिन दिमित्रोव

8
हालांकि आपको System.ComponentModel का उपयोग करने की आवश्यकता है।
यानिकिन

2
यह उपयोगी था, धन्यवाद। लेकिन मुझे लगता है कि आपका उत्तर बेहतर होगा यदि आपके पास इसके बजाय@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
शायद यह कुछ समय पहले लिखा गया था, लेकिन अब आप लेबलफ़ॉर के अंदर वर्ग का नाम निर्दिष्ट कर सकते हैं: जैसे @ Html.LabelFor (मॉडल => 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 इसका नकारात्मक पक्ष यह है कि लेबल को दोहराना होगा हर दृश्य में।
  • तीसरा विकल्प। डेटा वर्ग (विवरण का पालन) से जुड़ी मेटा-डेटा क्लास का उपयोग करें।

विकल्प 3 - मेटा-डेटा क्लास जोड़ें:

Microsoft मौजूदा वर्ग को संशोधित किए बिना , एक इकाई ढांचे पर गुणों को सजाने की अनुमति देता है ! मेटा-डेटा क्लासेस जो आपके डेटाबेस क्लासेस (प्रभावी रूप से आपके 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]आदि) पर मौजूदा विशेषताओं को अनदेखा कर सकता है, इसलिए आपको मेटा-डेटा वर्ग में उन लोगों की नकल करने की आवश्यकता हो सकती है।
  • यह जादू से संचालित नहीं होता है और यह किसी भी वर्ग के साथ काम नहीं करेगा। यूआई सजावट विशेषताओं के लिए दिखने वाला कोड पहले मेटा-डेटा वर्ग की तलाश के लिए बनाया गया है।

क्या ऐसा कोई कारण है कि यह ASP.NET Core 3.1 में काम नहीं करेगा? [आवश्यक] काम करता है, लेकिन नहीं [DisplayName ("मेरा लेबल")]
जॉन पास्कलेट

15

आप गुण के साथ संपत्ति का विज्ञापन करके लेबल के पाठ को बदल सकते हैं DisplayName

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

या, आप कच्चे HTML को स्पष्ट रूप से लिख सकते हैं:

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

1
@ शिम: आपको वास्तव में अपने विचारों में डेटाबेस / डोमेन मॉडल कक्षाओं के साथ सीधे काम नहीं करना चाहिए, आमतौर पर बीच में एक मध्यस्थ 'दृश्य-मॉडल' वर्ग होगा।
वामन

बाहरी तौर पर मैं लेबल सिंटैक्स का उपयोग करने के लिए क्या देख रहा था..धन्यवाद @xander
आसिफ इकबाल

1
"कच्चे एचटीएमएल को स्पष्ट रूप से लिखें" के साथ समस्या यह है कि आपको उस फॉर्म का उपयोग करने वाले हर बार लेबल को स्वयं लिखना होगा। मॉडल पर डी डिस्प्लेनाम घोषित करना बेहतर होगा।
सेसर लियोन

4

DisplayName विशेषता के साथ मॉडल गुण को सजाने।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.