2011-04-28 12 views
20

मैं क्या दिखाई देता है (मेरे लिए वैसे भी) एक अजीब समस्या होना है ...समस्या

मैं एक SelectListItem के लिए एक सरल संपादक टेम्पलेट (SelectListItem.cshtml ~/दृश्य/साझा में बनाया/EditorTemplates फ़ोल्डर), उदाहरण के लिए:

<ul class="select-list-item cell-15 col-3 omega clearfix"> 
    @Html.EditorFor(c => c.Categories) 
</ul> 

कहाँ c.Categories एक IEnumerable

यह ठीक काम किया है, लेकिन मैं थोड़ा अलग मार्कअप के साथ संग्रह प्रस्तुत करने के लिए एक और टेम्पलेट चाहता था, इसलिए मैं नकल की और नाम दिया संपादक टेम्पलेट, उदाहरण के लिए, 'Category Icons.cshtm 'और निम्नानुसार आह्वान किया गया:

<ul class="select-list-item cell-15 col-3 omega clearfix"> 
    @Html.EditorFor(c => c.Categories, "CategoryIcons") 
</ul> 

संक्षेप में, केवल अंतर है कि मैं एक नामित संपादक टेम्पलेट निर्दिष्ट कर रहा हूं।

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]', but this dictionary requires a model item of type 'System.Web.Mvc.SelectListItem'

टेम्पलेट के मॉडल घोषणा, दोनों टेम्पलेट्स आईडी में:

जब मैं पृष्ठ को खोलने, अब मैं निम्नलिखित त्रुटि मिलती है

@model System.Web.Mvc.SelectListItem 

मुझे समझ नहीं आता क्यों डिफ़ॉल्ट टेम्पलेट काम करता है और नामित टेम्पलेट नहीं करता है। किसी भी सहायता की सराहना की जाएगी।

धन्यवाद।

उत्तर

29

जब आप @Html.EditorFor(c => c.Categories) पर कॉल करते हैं तो यह IENumerable के लिए डिफ़ॉल्ट टेम्पलेट पर वापस आ रहा है। यह डिफ़ॉल्ट टेम्पलेट एमवीसी ढांचे द्वारा प्रदान किया जाता है, और इसका व्यवहार गणना में प्रत्येक आइटम के लिए Html.EditorFor() आउटपुट करना है। बदले में सूची में प्रत्येक आइटम के लिए उचित संपादक टेम्पलेट को अलग-अलग छोड़ दिया जाता है - आपके मामले में वे SelectListItem के सभी उदाहरण हैं, इसलिए पहले मामले में, प्रत्येक आइटम के लिए SelectListItem टेम्पलेट का उपयोग किया जाता है।

दूसरे मामले में, स्पष्ट रूप से अपने EditorFor स्थापित करने के लिए एक विशेष संपादक टेम्पलेट CategoryIcons का उपयोग करने के द्वारा, आप, पूरे गणन के लिए है कि संपादक टेम्पलेट का उपयोग करने के बजाय गणनीय अनुमति देने का यह कह रहे हैं में, डिफ़ॉल्ट रूप से टेम्प्लेट की जा करने के लिए प्रत्येक गणना आइटम के लिए टेम्पलेट का उपयोग करें।

मुझे अभी तक इस बारे में सबसे अच्छा तरीका नहीं है।

एक दृष्टिकोण CategoryIcon की एक स्पष्ट टेम्पलेट संदर्भ के साथ, एक CategoryIcons टेम्पलेट, जिसका मॉडल IEnumerable<CategoryIcon> का एक उदाहरण है, जो केवल Model गणन foreaches, और प्रत्येक आइटम के लिए Html.EditorFor करता है परिभाषित करने के लिए किया जाएगा। फिर आप उस टेम्पलेट में अपना प्रति-आइटम संपादक टेम्पलेट डाल दें (CategoryIconCategoryIcons)। इसके बाद आप @Html.EditorFor(c => c.Categories, "CategoryIcons") कर इसे कॉल करेंगे।

मैं यह देखने के लिए चारों ओर देखने के लिए जा रहा हूं कि ऐसा करने के बेहतर तरीके हैं, लेकिन मुझे आशा है कि यह अब के लिए उपयोगी हो सकता है। यह बहुत अच्छा होगा अगर टेम्पलेट्स को पैरामीटर किया जा सके, ताकि आप एक आईनेमरेबल टेम्पलेट लिख सकें जो टेम्पलेट का नाम प्रत्येक आइटम के लिए उपयोग करने के लिए तर्क के रूप में लेता है।

+2

मैं ठीक उसी प्रतिक्रिया लिख ​​रहा था, केवल दूसरी बात मैं जोड़ना होगा कि आप 'SelectListItem' किसी अन्य नाम के एक वर्ग के साथ रैप और प्रयोग है कि एक अलग टेम्पलेट प्राप्त करने के लिए कर सकते हैं, लेकिन किसी भी मामले में है, यह शायद है शुरू करने के लिए MVCContrib में जोड़ने के लिए किसी के लिए एक अच्छी जगह है। –

+1

स्पष्टीकरण और सलाह के लिए धन्यवाद। मैंने SelectListItem से विरासत में एक नई कक्षा बनाई और फिर उस वर्ग के लिए एक नया टेम्पलेट बनाया - यह पूरी तरह से काम करता है, लेकिन यह एक अनावश्यक ओवरहेड की तरह प्रतीत होता है। – Neilski

5

बस एक अपडेट, मैं इस प्रश्न पर खुद को एक ही मुद्दे को हल करने की कोशिश कर रहा था।

क्या मैं समाप्त हो गया कर एक तरह से इस तरह संग्रह के प्रत्येक उदाहरण के माध्यम से पुनरावृत्ति किया गया था और अलग-अलग EdtorFor बुला,:

<ul class="select-list-item cell-15 col-3 omega clearfix"> 
    @for (int i=0;i<Model.Categories.Count;i++) { 
     @Html.EditorFor(c => c.Categories[i], "CategoryIcons") 
    } 
</ul> 

फिर भी साफ नहीं है, लेकिन मैं इसे पसंद एक नया वर्ग इनहेरिट से बेहतर लगता है आप कर रहे हैं।

+0

बेन धन्यवाद, मुझे लगता है कि यह समाधान बहुत आसान है - खासकर यदि आप केवल मॉडल के एक उदाहरण से निपट रहे हैं। यह मेरे लिए मामला नहीं था, और मुझे लगा कि मेरे विशेष आवेदन में एक नई कक्षा बनाने से मुझे वास्तव में डेटा में कुछ अतिरिक्त तरीकों और गुणों को जोड़ने की अनुमति मिली। 'कोर्स के लिए घोड़ों' का एक मामला मुझे लगता है - आपकी पोस्ट के लिए धन्यवाद - बहुत सराहना की। – Neilski

1

(माफ करना अगर मेरी सी # वाक्यविन्यास एक छोटे से बंद है, मैं vb.net में लिखने) आप EditorFor उपयोग कर रहे हैं, मुझे नहीं लगता पाशन समाधान काम करेंगे है। ऐसा लगता है कि IENumerable टेम्पलेट का उपयोग फ़ॉर्म इनपुट को सही तरीके से नामित करने का एकमात्र तरीका है; यदि आप बार-बार संपादक को कॉल करते हैं, तो आपके फॉर्म <INPUT> के पास अनुक्रमित आईडी की बजाय एक ही आईडी होगी।

मुझे इस समस्या का अनुभव हुआ और solution सूची आइटमों के माध्यम से लूप को उत्सर्जित करने के लिए नहीं था।

यह उत्तर देने के लिए खेद है कि कोई टिप्पणी न करें - टिप्पणी करने के अधिकार नहीं हैं।