2011-12-07 13 views
7

मैंने कस्टम संपादक टेम्पलेट्स और डिस्प्ले टेम्पलेट्स बनाए हैं। मैंने इन दृश्यों में से प्रत्येक को मेरे विचार फ़ोल्डर में एक फ़ोल्डर में रखा है। फ़ोल्डरों को या तो संपादक टेम्पलेट या डिस्प्ले टेम्पलेट नाम दिया गया था, इस पर निर्भर करता है कि किस प्रकार का टेम्पलेट बनाया गया था।एमवीसी 3 डिस्प्ले टेम्पलेट्स

तो, अब मैं अपने कस्टम संपादक टेम्पलेट या मेरे कस्टम संपादक टेम्पलेट के लिए DisplayFor का उपयोग करने के लिए EditorFor का उपयोग कर सकता हूं।

मैं लेबलफ़ोर के लिए एक कस्टम टेम्पलेट बनाना चाहता हूं, लेकिन मुझे इसका कोई उदाहरण नहीं मिला है। क्या मैं अपने दृश्य फ़ोल्डर में Labeltemplate नामक एक फ़ोल्डर बनाउंगा और इसे यहां जोड़ूं?

अद्यतन

कारण मैं LabelFor विस्तार करने के लिए कोशिश कर रहा था एक संपत्ति प्रकार KeyValuePair की है कि संभाल करने के लिए किया गया था। मैं इस संपत्ति की कुंजी लेबल के रूप में और प्रदर्शन के रूप में मान का उपयोग करना चाहता हूं। मैंने वैल्यू को संभालने के लिए DisplayFor के बारे में here पर एक प्रश्न पूछा।

मेरे समाधान के रूप में>

@Html.DisplayFor(m => m.MyProperty, @Model.MyProperty.Key) 

धन्यवाद समाप्त हो गया,

उत्तर

6

LabelFor किसी भी टेम्पलेट का उपयोग नहीं करता है। यह एमवीसी स्रोत कोड में हार्डकोड किया गया है और यह <label> थकाता है इससे कोई फर्क नहीं पड़ता कि आप क्या करते हैं।

यदि आप इस व्यवहार को संशोधित करना चाहते हैं तो आपको एक कस्टम HTML सहायक लिखना होगा।

दूसरी ओर यदि आप टेम्पलेट्स का उपयोग करना चाहते हैं तो आपको EditorFor/DisplayFor helpers का उपयोग करना होगा। इसलिए, चूंकि एक लेबल प्रदर्शित करने के लिए एक लेबल है, इसलिए आप एक प्रदर्शन टेम्पलेट का उपयोग कर सकते हैं और Html.LabelFor(x => x.Foo) का उपयोग करने के बजाय Html.DisplayFor(x => x.Foo) का उपयोग कर सकते हैं। जहां तक ​​कस्टम टेम्पलेट का संबंध है, या तो आप Foo संपत्ति [UIHint] विशेषता के साथ सजाने या DisplayFor सहायक के लिए दूसरे तर्क के रूप में पास करते हैं।


अद्यतन:

अपनी टिप्पणी के अनुसार आप मार्कअप लेकिन केवल मूल्य को संशोधित करने का प्रयास नहीं कर रहे हैं। यही कारण है कि LabelFor सहायक की दूसरा तर्क इस्तेमाल किया जा सकता है के लिए:

@Html.LabelFor(x => x.Foo, Model.Key) 
@Html.EditorFor(x => x.Foo) 

यह एक लेबल जो फू इनपुट (लेबल ठीक से सौंपा की for विशेषता) से संबद्ध है लेकिन दिखाए जाने वाले टेक्स्ट Key का है बनाता है आपके दृश्य मॉडल पर संपत्ति।

+0

मैं लेबल के साथ ठीक हूँ, लेकिन मैं के अलावा अन्य एक मूल्य के लेबल के भीतर पाठ निर्धारित करना चाहते हैं सहायक क्या उपयोग करता है। मेरी संपत्ति एक keyvaluepair है, और मैं लेबल को संपत्ति की 'कुंजी' पर सेट करना चाहता हूं। कोई विचार? –

+0

"DisplayFor" का उपयोग करने से सावधान रहें। आपका समाधान काम करेगा लेकिन डिस्प्लेफ़ोर का उपयोग मूल्य के "केवल पढ़ने के लिए" डिस्प्ले बनाने के लिए किया जाना था और संपत्ति के लिए लेबल नहीं बनाना था। इसके द्वारा मेरा मतलब है कि "डेटटाइम" के लिए डिस्प्लेफ़ोर का उपयोग डेटा समय प्रदर्शित करने के प्रारूप को अनुकूलित करने के लिए किया जाएगा। आपके कस्टम मॉडल या कक्षा के लिए "DisplayFor" टेम्पलेट आउटपुट मान करेगा। –

+0

शायद मैं लेबल को कड़ी मेहनत करूँगा, और एक सहायक का उपयोग नहीं करता। –

2

विशिष्ट HTML सहायक विधि (लेबलफ़ोर) के लिए टेम्पलेट बनाने के लिए कोई समर्थन नहीं है।

आप किए जा सकेंगे:

मार्कअप अपने मॉडल मेटा वर्णनकर्ता का उपयोग कर क्या मान बदलने के लिए लेबल के हिस्से के रूप में प्रदर्शित किया जाता है:

[DisplayName("Custom Label")] 
public string Test {get;set;} 

आप एक लेबल बाहर प्रतिपादन के लिए अपने स्वयं के कस्टम एचटीएमएल हेल्पर विधि बना सकते हैं :

How can I override the @Html.LabelFor template?

+0

मैंने उस प्रश्न में दिए गए समाधान की कोशिश की, लेकिन मुझे अपनी KeyValuePair प्रॉपर्टी से 'कुंजी' मान की आवश्यकता थी। उनके प्रश्न लेबल के प्रारूपण (एक अवधि टैग जोड़ा) के साथ निपटाया। –

+0

उस पोस्ट का कोड आपके लिए "अंतिम समाधान" नहीं था, इसका मतलब यह नहीं था कि आप एक HTML सहायक बनाने के लिए मूल कोड दें जो आप चाहते थे। –

+0

यह मुझे मूल बातें देता था, लेकिन संपत्ति का मूल्य, एक महत्वपूर्ण तत्व गायब था। ऐसा लगता है कि कोड केवल संपत्ति के मेटाडेटा के साथ काम करता था, लेकिन मूल्य नहीं। यह सब मुझे वास्तव में जरूरी था, लेकिन यह सुनिश्चित नहीं था कि यह उपलब्ध था या नहीं। –

1

आप एक DisplayTemplate और टेम्पलेट नाम के माध्यम से यह पहुंच बना सकते हैं:

@Html.DisplayFor(x => x.Foo, "label") 

और फिर अपने प्रदर्शन टेम्पलेट फ़ोल्डर में label.cshtml नामक टेम्पलेट बनाएं।

इस कॉल को आसान बनाने के लिए, आप एक विस्तार विधि कि यह कॉल हैंडल लिख सकते हैं:

public static MvcHtmlString TemplateLabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> property) 
{ 
    return html.DisplayFor(property, "label"); 
} 
संबंधित मुद्दे