2012-10-04 10 views
38

मैं एमवीसी 4 (रेजर व्यू इंजन) के साथ शुरू कर रहा हूं। (मेरा मानना ​​है कि यह एमवीसी 3 और इससे पहले भी लागू हो सकता है।) मैं सोच रहा हूं कि डिस्प्ले एट्रिब्यूट डेटा एनोटेशन का उपयोग करने के लिए कोई दृश्य है या नहीं, केवल HTML में सीधे एक स्ट्रिंग लिखना।एमवीसी 4 डेटा एनोटेशन "डिस्प्ले" विशेषता

public class Thing 
{ 
    public string WildAndCrazyProperty { get; set; } 
} 

... वहाँ के रूप में संपत्ति व्याख्या में किसी भी लाभ होगा::

[Display(Name = "Wild and Crazy")] 
    public string WildAndCrazyProperty { get; set; } 

... और होने मेरी मार्कअप हो:

उदाहरण के लिए, अगर मैं निम्नलिखित मॉडल था
<html> 
    <body> 
     <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
     <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
    </body> 
</html> 

... एनोटेशन नहीं होने, और कर बनाम:

<html> 
    <body> 
     <div>Wild and Crazy</div> 
     <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> 
    </body> 
</html> 

इस मामले में मैंने Html.LabelFor का उल्लेख नहीं किया है क्योंकि संपत्ति का डेटा स्थैतिक के रूप में प्रदर्शित किया जा रहा है (यानी। गैर संपादन योग्य) पृष्ठ पर पाठ। डेटा इस पृष्ठ पर कभी भी संपादन योग्य नहीं होगा, इसलिए Html.TextBoxFor को दूसरे < divके भीतर उपयोग करने की आवश्यकता नहीं है और बाद में उस टेक्स्ट बॉक्स के साथ लेबल को सही ढंग से संबद्ध करने के लिए Html.LabelFor का उपयोग करें।

उत्तर

45

यदि दो अलग-अलग विचार एक ही मॉडल को साझा कर रहे हैं (उदाहरण के लिए, शायद एक मोबाइल आउटपुट के लिए है और एक नियमित है), स्ट्रिंग को एक ही स्थान पर रखना अच्छा लगेगा: व्यूमोडेल पर मेटाडेटा के रूप में।

इसके अतिरिक्त, यदि आपके पास मॉडल का विरासत संस्करण था जो एक अलग प्रदर्शन की आवश्यकता है, तो यह उपयोगी हो सकता है। उदाहरण के लिए:

public class BaseViewModel 
{ 
    [Display(Name = "Basic Name")] 
    public virtual string Name { get; set; } 
} 

public class OtherViewModel : BaseViewModel 
{ 
    [Display(Name = "Customized Inherited Name")] 
    public override string Name { get; set; } 
} 

मैं मानता हूँ कि कि उदाहरण सुंदर काल्पनिक है ...

उन विशेषता है कि मैं के साथ आ सकते हैं का उपयोग कर के पक्ष में सबसे अच्छा तर्क हैं। मेरी व्यक्तिगत राय यह है कि, अधिकांश भाग के लिए, इस तरह की चीज मार्कअप के लिए सबसे अच्छी तरह से छोड़ी जाती है।

+4

और जिस तरह से मैं झुका रहा हूं। ऐसा लगता है कि आप ऐसा कुछ चाहते हैं जो वास्तविक प्रदर्शन करने वाले कोड के हिस्से में वास्तव में एक प्रदर्शन-प्रकार-चीज़ का अधिक हो। प्रोजेक्ट को फिर से कंपाइल करने के लिए सिर्फ शीर्षक या दो बदलने के लिए अनावश्यक लगता है। –

+0

मैं पूरी तरह से पुनर्मूल्यांकन बिंदु पर सहमत हूं। मुझे लगता है कि अगर आपको कई विचारों में मॉडल का उपयोग करना पड़ता है, तो उस डेटा को एक विशेषता में डालने के पेशेवरों को विपक्ष से अधिक नहीं होता है। – eouw0o83hf

+2

तो मुझे वास्तव में इस उत्तर के पीछे अवधारणा पसंद है, फिर भी यह मेरे लिए काम नहीं करता है। मेरी विरासत कक्षा बेस क्लास की 'प्रदर्शन' विशेषता को ओवरराइड नहीं करती है। कोई कारण क्यों? – Kehlan

8

लाभों में से एक यह है कि आप इसे कई विचारों में उपयोग कर सकते हैं और एक सतत लेबल टेक्स्ट प्राप्त कर सकते हैं। यह भी asp.net MVC के मचान से इनका उपयोग किया पाठ उत्पन्न करने के लिए और यह आसान सार्थक पाठ उत्पन्न करने के लिए बनाता है

[Display(Name = "Wild and Crazy")] 
public string WildAndCrazyProperty { get; set; } 

"जंगली और पागल" लगातार दिखाई देता है जहाँ भी आप अपने आवेदन में संपत्ति का उपयोग करें।

कभी-कभी यह लचीला नहीं है क्योंकि आप कुछ दृश्य में टेक्स्ट को बदलना चाहते हैं। उस स्थिति में, आपको अपने दूसरे उदाहरण

+0

इस मामले में, मेरे पास केवल एक दृश्य है, इसलिए शायद यही कारण है कि मैं लाभ नहीं देख सका। इस लाभ के बावजूद, ऐसा लगता है कि पुनर्मूल्यांकन के परिणाम से पहले इस संपत्ति को पुन: उपयोग करने के लिए बड़ी संख्या में विचारों का लाभ हो सकता है, लाभ से अधिक होगा। –

13

अन्य उत्तरों के अतिरिक्त कस्टम मार्कअप का उपयोग करना होगा, जब आप फ़ील्ड को स्थानीयकृत करना चाहते हैं तो DisplayAttribute का उपयोग करने का एक बड़ा लाभ है। आप DisplayAttribute का उपयोग करके स्थानीयकरण डेटाबेस में नाम देख सकते हैं और यह आपके इच्छित अनुवाद का उपयोग करेगा।

इसके अलावा, आप Html.EditorForModel() का उपयोग करके एमवीसी आपके लिए टेम्पलेट जेनरेट कर सकते हैं और यह आपके लिए सही लेबल उत्पन्न करेगा।

आखिरकार, यह आपके ऊपर है। लेकिन एमवीसी बहुत "मॉडल केंद्रित" है, यही कारण है कि डेटा विशेषताओं को मॉडल पर लागू किया जाता है, ताकि मेटाडाटा एक ही स्थान पर मौजूद हो। ऐसा नहीं है कि आपको अतिरिक्त टाइपिंग करना है।

+0

मेरे वर्तमान मामले में, ऐप एक वेबएपीआई सेवा के लिए सिर्फ एक टेस्ट फ्रंट एंड है। कोई स्थानीयकरण आवश्यक नहीं है; लेकिन मैं इस तरह के व्यवहार का लाभ देख सकता हूं। –

+0

@ केनेथके। - ऐसी कई चीजें हैं जो आपको अभी लाभ नहीं दे सकती हैं, लेकिन आप चाहें कि आप बाद में कर लेंगे। 3-स्तरीय आर्किटेक्चर का उपयोग करने से आपको लाभ नहीं हो सकता है, लेकिन बाद में ... आप अपने सिर को स्मैक कर देंगे। मुद्दा यह है कि इसका इस्तेमाल करें या नहीं .. यह आपकी पसंद है, लेकिन यह बताने की कोशिश न करें कि यह बेकार है। –

+0

अगर मैं इस तकनीक को लागू करने के रूप में आया था तो बेकार था, मैं निश्चित रूप से इरादा नहीं था। जैसा कि मैंने उल्लेख किया है, ऐप बस एक वेब सेवा के लिए एक मुखौटा है। इस क्षमता के बाहर आवेदन का उपयोग करने का कोई मौका नहीं है। चूंकि ऐप में बिल्कुल एक दृश्य शामिल है, इसलिए मुझे लाभ दिखाई नहीं दे सका। अब अगर मैं वैश्विक दर्शकों के साथ सार्वजनिक-सामना करने वाले एप्लिकेशन को डिजाइन कर रहा था, हां, जो आप वर्णन करते हैं वह सही समझ में आता है। यह इस विशेष एप्लिकेशन का आकार है जिसने स्पष्ट नहीं किया कि विशेषता सहायक क्यों होगी। –

संबंधित मुद्दे