ViewData आइटम जिसमें कुंजी 'MY KEY' है, 'System.String' प्रकार का है, लेकिन 'IEnumerable <SelectListItem>' प्रकार का होना चाहिए


142

मैं ASP.NET MVC 2 का उपयोग करके Linq-2-SQL के साथ मैप किए गए डेटाबेस से एक ड्रॉपडाउन सूची को पॉप्युलेट करने की कोशिश कर रहा हूं, और इस त्रुटि को प्राप्त करता रहता हूं।

मैं इसलिए उलझन में हूं क्योंकि मैं IEnumerable<SelectListItem>दूसरी पंक्ति पर एक प्रकार का चर घोषित कर रहा हूं , लेकिन त्रुटि मुझे बताती है कि ऐसा नहीं है। मुझे लगता है कि यह बहुत सरल होना चाहिए, लेकिन मैं संघर्ष कर रहा हूं। किसी भी मदद की सराहना की है।

यहाँ मेरे नियंत्रक के दिलचस्प बिट्स हैं:

public ActionResult Create()
{
    var db = new DB();
    IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
        b => new SelectListItem { Value = b.basetype, Text = b.basetype });
    ViewData["basetype"] = basetypes;
    return View();
}

और यहाँ मेरे विचार के दिलचस्प अंश हैं:

<div class="editor-label">
   <%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
   <%: Html.DropDownList("basetype") %>
   <%: Html.ValidationMessageFor(model => model.basetype) %>
</div>

फॉर्म जमा करते समय यहां POST कार्रवाई होती है

// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View(meal);
        }
    }
    else
    {
        return View(meal);
    }
}

धन्यवाद।


1
ड्रॉपडाउन सूची दृश्य में ठीक दिखाई देती है। यह डेटाबेस से पॉप्युलेट करता है जैसा कि यह होना चाहिए, लेकिन यह तब होता है जब मैं उस फॉर्म को पोस्ट करता हूं जो मुझे ये त्रुटियां मिलती हैं।
JBibbs

6
स्वीकार किए गए उत्तर का सारांश: सुनिश्चित करें कि आप सूची को अपने नियंत्रक के कार्यों के बाद प्राप्त करते हैं। ऐसा करना भूल जाना आसान है, और फिर अधिक जटिल बग की तलाश में समय बर्बाद करना समाप्त करना।
एडम टोले

जवाबों:


208

मुझे भी यही समस्या थी, और आखिरकार मुझे जवाब मिल गया ...

समस्या यह है कि POST कार्रवाई में, फॉर्म सबमिट करने के बाद, मॉडलस्टेट मान्य नहीं है, या यह कोशिश / पकड़ने में त्रुटि पकड़ रहा है, इसलिए दृश्य वापस आ गया है। लेकिन इस बार व्यू ने ViewData["basetype"]सही सेट नहीं किया है।

आपको इसे फिर से पॉप्युलेट करने की जरूरत है, शायद पहले इस्तेमाल किए गए कोड के साथ, इसलिए इसे दोहराएं:

var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
    b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;

विधि return View(meal)में पहले [HttpPost]

वास्तव में यह आपकी समस्या का समाधान करेगा:

[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            var db = new DB();
            IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
               b => new SelectListItem { Value = b.basetype, Text = b.basetype });
            ViewData["basetype"] = basetypes;
            return View(meal);
        }
    }
    else
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
            b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        ViewData["basetype"] = basetypes;
        return View(meal);
    }
}

मुझे पता है कि यह सवाल बहुत पुराना है, लेकिन मैं आज उसी समस्या के साथ यहां आया था, इसलिए अन्य बाद में यहां आ सकते हैं ...


8
+1 के लिए "इसे फिर से आबाद करें" ... मेरे पास अपने दृश्य मॉडल की रचना के लिए एक काफी मजबूत प्रणाली है, लेकिन मैं इसे कॉल करने के लिए पूरी तरह से भूल गया था। इस प्रकार, संपत्ति आबाद नहीं हुई थी और मुझे यह (बल्कि अस्पष्ट) संदेश मिला था कि मैंने क्या कोशिश की।
टिम मेडोरा

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

1
+1 क्योंकि मैं अपने व्यूबाग को इंडेक्स विधि में सेट कर रहा था, जब मैं वास्तव में एक एचटीएमएल को कॉल कर रहा था। एक अन्य एक्शन विधि के लिए !!
स्वैम्फॉक्स

धन्यवाद। यह अच्छा होगा यदि इसे अभी संरक्षित किया गया है लेकिन मुझे लगता है कि यह MVC नहीं होगा।
केसी

यदि मॉडल अमान्य हो रहा है तो मैं आता हूं कि उपयोगकर्ता द्वारा प्रस्तुत डेटा db में सहेजा जाएगा? मैं भी एक ही समस्या का सामना कर रहा हूँ। मैं एक नौसिखिया हूँ। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।
कौशिक साहा

87

यदि SelectList शून्य है, तो आपको यह त्रुटि मिलेगी।


3
हां, यह एक सामान्य त्रुटि / ओवरसाइट है जब आप एक GET पर SelectList सेट करते हैं तो एक POST एक्शन (स्पष्ट रूप से) पर पोस्टबैक ModelState.IsValid==falseकरते हैं, ताकि आपके return View(model) पास मॉडल वापस आ जाए लेकिन POST से लौटने से पहले अपने SelectList स्रोत को फिर से न खोलें। चूंकि कोई ViewState ala WebForms नहीं है, इसलिए @Html.DropDownसहायक के साथ चयन का पुनर्निर्माण करने के लिए कोई स्रोत नहीं है । आपको उस स्रोत सूची को हर बार पॉप्युलेट करना होगा जब आप ग्राहक को केवल GET पर ही दृश्य लौटाएंगे।
प्रिज्म

हाँ, यह मेरा मुद्दा था। कॉल प्राप्त करने पर चयनकर्ता को पॉप्युलेट करना न भूलें। बहुत भ्रामक त्रुटि। महान पद।
मैट

3

मैं अभी इस मुद्दे पर आया हूं और इस लेख ने मुझे इसके माध्यम से मदद की है - http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc। aspx

सबसे अधिक संभावना यह है कि आपके संग्रह को कवि के बाद फिर से प्रस्तुत किया गया है


1

भविष्य के पाठकों के लिए, यदि आप रेजर का उपयोग कर रहे हैं, तो सूची से IEnumerable के लिए चयन सूची के प्रकार को बदलने का प्रयास करें।

से

@Html.DropDownListFor(m => m.id, ViewBag.SomeList as List<SelectListItem>)

सेवा

@Html.DropDownListFor(m => m.id, ViewBag.SomeList as IEnumerable<SelectListItem>)

0

पहले पैरामीटर के रूप में अपनी ड्रॉपडाउन सूची के नाम के लिए एक स्ट्रिंग जोड़ने का प्रयास करें, और आइटम को अपने व्यूडेटा से बाहर निकालें:

 <%= Html.DropDownList("SomeDropdownName", (IEnumerable<SelectListItem>)ViewData["basetype"]) %>

यहां एक विस्तार विधि भी है जिसका उपयोग आप कर सकते हैं ताकि ड्रॉपडाउन सूची को इसी तरह से स्थापित किया जाए कि आपने अपने अन्य नियंत्रण कैसे किए हैं:

        public static string DropDownList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel)
        where TModel : class
    {
        string inputName = ExpressionHelper.GetInputName(expression);
        return htmlHelper.DropDownList(inputName, selectList, optionLabel);
    }

उदाहरण के लिए

<%= Html.DropDownList(x => x.BaseType, (IEnumerable<SelectListItem>)ViewData["basetype"], "")%>

0

आप व्यूडेटा शब्दकोश में एक आइटम के रूप में संग्रह को सेट कर रहे हैं और मॉडल पर संपत्ति के रूप में इसे पुनः प्राप्त करने की कोशिश कर रहे हैं। एक साधारण फिक्स इसे उसी तरह से संदर्भित करना होगा जैसे आपने इसे सेट किया था:

    <%var basetype = ViewData["basetype"] as IEnumerable<SelectListItem>;%>
    <div class="editor-label">
        <%: Html.Label("basetype") %>
    </div>
    <div class="editor-field">
        <%: Html.DropDownList("basetype", basetype) %>
        <%: Html.ValidationMessage("basetype") %>
    </div>

वैकल्पिक रूप से, नीचे दिया गया कोड एक दृढ़ता से टाइप किए गए दृश्य का उपयोग करता है:

public class ViewModel {
   //Model properties
   public IEnumerable<SelectListItem> basetype {get;set;}
}

public ActionResult Create()
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        return View(new ViewModel { basetype=basetypes });
    }

फिर, अपने दृढ़ता से टाइप किए गए दृश्य में:

    <div class="editor-label">
        <%: Html.LabelFor(model => model.basetype) %>
    </div>
    <div class="editor-field">
        <%: Html.DropDownListFor(model=>model.basetype) %>
        <%: Html.ValidationMessageFor(model => model.basetype) %>
    </div>

मैंने आपके "सरल फिक्स" उदाहरण में कोड का उपयोग करने की कोशिश की है, और वही त्रुटि मिली है। मुझे यह उल्लेख करना चाहिए कि ड्रॉपडाउन सूची दृश्य में ठीक है, लेकिन मुझे यह त्रुटि तब मिलती है जब मैं फॉर्म जमा करता हूं।
JBibbs

क्या आप कंट्रोलर एक्शन के लिए कोड पोस्ट कर सकते हैं जो फॉर्म सबमिशन को हैंडल करता है?
इगोर ज़ेवाका

ज़रूर, मैं इसे मूल पोस्ट में जोड़ दूंगा। अब तक आपकी मदद के लिए धन्यवाद।
JBibbs

0

यदि आप Html.DropDownList()विधि का उपयोग करते हैं - तो वही त्रुटि हो सकती है, यदि आपका ViewData / Viewbag आइटम सेट नहीं है, जैसा @Peto ने उत्तर दिया है।

लेकिन यह नियंत्रक सेट आइटम के मामले में सही तरीके से सेट नहीं किया जा सकता है, लेकिन मुख्य दृश्य में आप नए ViewDataDictionary मूल्यों के साथ आंशिक विवो कॉल का उपयोग करते हैं।

यदि आपके पास है @Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })तो आपका आंशिक दृश्य पैरामीटर नहीं देखेगा ViewDataऔर ViewBagडेटा को हटा देगाnew ViewDataDictionary()


0

भविष्य के पाठकों के लिए,

मैं आज समस्या लेकर आया था और इसे ठीक नहीं कर पाया। यह सब के बाद वास्तव में सरल हो गया। मैं एक तालिका + दृश्य के साथ काम कर रहा था। जब मैंने तालिका को अपडेट किया (कुछ कॉलम्स को जोड़ा) तो मैं दृश्य को अपडेट (ड्रॉप और रीक्रिएट) करना भूल गया, जिससे मेरे लिए समस्या पैदा हो गई। आशा है कि यह किसी की मदद करता है।


0

मुझे आज एक ही त्रुटि मिली और मेरा समाधान मॉडल को "वैध" बनाना है।

मेरे मामले में, उपयोगकर्ता द्वारा "सेव" पर क्लिक करने के बाद, मुझे मॉडल राज्य मिला: यदि उपयोगकर्ता कुंजी "0" में है, लेकिन उपयोगकर्ता स्थिति "0.0" में उपयोगकर्ता की स्थिति मान्य होगी।

इसलिए मैं "IsValid" विधि को ओवरराइड करता हूँ ताकि सही उपयोगकर्ता की-इन "0" भी वापस आ सके।

आशा करता हूँ की ये काम करेगा।

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