'IEnumerable <SelectListItem>' प्रकार की कोई ViewData आइटम नहीं है जिसमें कुंजी 'xxx' है


87

स्टैक ओवरफ्लो पर इस बारे में कुछ पोस्ट हैं, लेकिन एक जवाब के साथ कोई नहीं जो मेरी वर्तमान स्थिति में समस्या को ठीक करने के लिए लगता है।

मेरे पास एक पृष्ठ है जिसमें एक तालिका है, प्रत्येक पंक्ति में कई पाठ फ़ील्ड और एक ड्रॉपडाउन है। सभी ड्रॉपडाउन को उसी SelectList डेटा का उपयोग करने की आवश्यकता है, इसलिए मैंने इसे इस प्रकार सेट किया है:

नियंत्रक

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

राय

<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>

मैंने कई स्थानों पर बिल्कुल इस सेटअप का उपयोग किया है, लेकिन किसी विशेष कारण से इस त्रुटि के कारण मुझे त्रुटि मिलती है:

टाइप 'IEnumerable' का कोई ViewData आइटम नहीं है जिसमें कुंजी 'सबमार्केट_0' है।


1
क्या आपने यह कोशिश की? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>DropDownList लेता है IEnumerable<SelectListItem>
LukLed

@LukLed - यह वास्तव में है कि मैंने आखिरकार त्रुटि का स्रोत कैसे पाया :) और साथ ही कुछ अन्य पोस्ट की जानकारी भी! धन्यवाद
Jimbo

<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
अरविस

आज इसका एनकाउंटर किया गया और पाया गया कि मेरे ड्रॉपडाउनिस्ट हेल्पर में दूसरा तर्क शून्य था, जो @jonathanesell से नीचे की खोज में था।
केन पामर

जवाबों:


79

ठीक है, इसलिए इस समस्या के बारे में कुछ अन्य पदों से उत्तर प्राप्त किया गया था और यह है:

यदि आपका ViewDataएक होता है SelectListअपने नाम के साथ ही DropDownListयानी "submarket_0", एचटीएमएल सहायक स्वचालित रूप से अपने ही बस जाएँगे DropDownListकि डेटा के साथ अगर आप 2 पैरामीटर निर्दिष्ट नहीं करते हैं जो इस मामले में स्रोत selectList है।

मेरी त्रुटि के साथ क्या हुआ था:

चूँकि ड्रॉप डाउन सूचियों वाली तालिका एक आंशिक दृश्य में ViewDataथी और इसे बदल दिया गया था और अब इसमें SelectListमुझे संदर्भित नहीं किया गया था, HtmlHelper(एक त्रुटि को फेंकने के बजाय) ने ViewData (GRRRR) में "सबमार्केट_0" नामक SelectList को खोजने की कोशिश की! !!) जो यह अभी तक नहीं मिल सका, और फिर उस पर एक त्रुटि फेंक दिया :)

मुझे सही जवाब दो अगर मैं गलत हूँ


104
मुझे यह त्रुटि मिली क्योंकि ड्रॉप डाउन सूची के लिए SelectListItems का मेरा संग्रह अशक्त था, जो आपको लगता है कि वही समस्या है।
जोनाथन सीवेल

6
इस समस्या से जूझ रहे अन्य लोगों के लिए, अस्थायी रूप से अपनी ड्रॉप डाउन सूची को शून्य जांच में लपेटें, जैसे @if (ViewData ["सबमार्केट्स"]! = Null)। यदि दृश्य तब एक त्रुटि को फेंकने के बिना (और आपकी ड्रॉप डाउन सूची के बिना) प्रस्तुत करता है, तो आप अपनी समस्या की पहचान करेंगे। "नो व्यू डेटा आइटम" त्रुटि इस मामले में बहुत भ्रामक है।
GDB

मैं एक का उपयोग कर इस में भाग गया Ajax.ActionLink। बस जोड़ने SelectList Getके लिए ActionMethodहै कि अजाक्स कॉल में शामिल है।
बदबू

हां! मैंने उस सूची का नाम बदल दिया है जो मैं नियंत्रक से ViewData में गुजर रहा था, और इसे दृश्य में नहीं बदला था। यह वास्तव में बहुत भ्रामक त्रुटि संदेश है!
14

1
@JonathanSewell आपको धन्यवाद, धन्यवाद, धन्यवाद! यह मेरी सटीक समस्या थी।
johnw182

29

पुराना सवाल है, लेकिन यहाँ समस्या का एक और स्पष्टीकरण है। यहां तक ​​कि अगर आपके पास दृढ़ता से टाइप किए गए विचार हैं और अपनी ड्रॉपडाउन सूची बनाने के लिए ViewData का उपयोग नहीं कर रहे हैं, तो भी आपको यह त्रुटि मिलेगी। जब आप MVC स्रोत को देखते हैं तो त्रुटि का कारण स्पष्ट हो सकता है :

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

तो अगर आपके पास कुछ ऐसा है:

@Html.DropDownList("MyList", Model.DropDownData, "")

और Model.DropDownDataअशक्त है, MVC आपके नाम के साथ कुछ देखने के लिए आपके ViewData के माध्यम से देखता है MyListऔर उस नाम के साथ ViewData में कोई ऑब्जेक्ट नहीं होने पर एक त्रुटि फेंकता है।


1
नमस्ते, यह मेरी समस्या भी है, सूची शून्य होने पर हम क्या करते हैं ! क्या आप कुछ सुझा सकते हैं,
ट्रांसफॉर्मर

4
@transformer करने के लिए सबसे आसान काम करने के लिए एक रिक्त सूची के बजाय Model.DropDownData को रिक्त स्थान पर सेट करना होगा। यदि यह संभव नहीं है, तो आप सूची के अशक्त होने की जाँच करने के लिए अपने रेजर मार्कअप को बदल सकते हैं, और यदि ऐसा है, तो एक खाली चयन सूची प्रस्तुत करें।
हॉकके

15

मेरे पास एक ही त्रुटि थी, मुझे लगता है कि समस्या यह है कि त्रुटि पाठ भ्रामक है , क्योंकि इसका एक गलत नाम है।

आपके मामले में यह कहना चाहिए कि "IEnumerable" प्रकार का कोई ViewData आइटम नहीं है जिसमें कुंजी "सबमार्क" है।

मेरी त्रुटि दृश्य कोड (आपके "सबमार्केट्स") में एक गलत वर्तनी थी, लेकिन त्रुटि पाठ ने मुझे पागल कर दिया।

मैं इस उत्तर को पोस्ट करता हूं क्योंकि मैं इस त्रुटि की तलाश कर रहे लोगों को कहना चाहता हूं, जैसे कि मैं था, यह समस्या यह है कि इसका IENumerable नहीं मिल रहा है, लेकिन इस संस्करण में जो इसके लिए देखना चाहते हैं ("सबमार्केट्स" इस मामले में), गलती में नहीं दिखाया गया है ("सबमार्केट_0")

स्वीकृत उत्तर बहुत दिलचस्प है, लेकिन जैसा कि आपने कहा कि यदि आप 2 पैरामीटर निर्दिष्ट नहीं करते हैं तो कन्वेंशन लागू किया जाता है, इस मामले में यह निर्दिष्ट किया गया था, लेकिन संस्करण नहीं मिला (आपके मामले में क्योंकि दृश्यता यह नहीं था, मेरे मामले में क्योंकि मैंने var नाम याद किया)

उम्मीद है की यह मदद करेगा!


9

समस्या यह है कि पोस्ट बैक सबमिट बटन क्लिक पर होता है। इसलिए सबमिट पर डेटा पोस्ट करते समय वापस लौटने से पहले फिर से लिखें देखें ()

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

3

नाम स्थान की जाँच करें।

आप System.Web.Mvc.SelectListItem के बजाय, System.Web.Webpages.Html.SelectListItem को कंट्रोलर में असाइन कर सकते हैं ।


1

यह ठीक भी है; उदाहरण के लिए:
==> "नंबरकंट्रोलर" फ़ाइल में:

public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number)
{
    if (ModelState.IsValid)
    {
        ...
        ...
        return RedirectToAction("Index");
    }
    ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", 
                                "OperatorSign", number.OperatorId);                
    return View();
}

==> दृश्य फ़ाइल में (Create.cshtml):

<div class="form-group">
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = 
                   "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { 
                        @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Number1, "", new { @class = 
                                   "text-danger" })
    </div>
</div>

अब यदि हम इस कथन को हटा दें:

ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);

निम्नलिखित कथन के पीछे से (हमारे नियंत्रक में):

return View();

हम इस त्रुटि को देखेंगे:

टाइप 'IEnumerable' का कोई ViewData आइटम नहीं है जिसमें कुंजी 'OperatorId' है।

* तो इन बयानों के मौजूदा के बारे में सुनिश्चित हो। *


0

मेरे लिए, यह त्रुटि उत्पन्न करने वाली समस्या तब उत्पन्न हुई जब मैं डेटाबेस में एक नई पंक्ति सहेज रहा था, लेकिन एक फ़ील्ड शून्य थी। डेटाबेस तालिका डिज़ाइन में, वह फ़ील्ड NULL नहीं है। इसलिए जब मैंने शून्य-फ़ील्ड के लिए शून्य मान के साथ एक नई पंक्ति को सहेजने का प्रयास किया, तो Visual Studio ने यह त्रुटि डाली। इस प्रकार, मैंने सुनिश्चित किया कि क्षेत्र को एक मान दिया गया था, और समस्या ठीक हो गई थी।


0

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

[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}

में बदलो

[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}

अब ठीक काम करता है।


0

इसका कारण वस्तुओं के अनुचित उपयोग के बजाय वाक्य रचना के विपरीत नहीं है। ViewData, ViewBag, और View Life Cycle में वस्तुओं का जीवन चक्र सत्र की तुलना में छोटा है। फ़ॉर्मर्स में परिभाषित डेटा एक अनुरोध-प्रतिक्रिया के बाद खो जाएगा (यदि अनुरोध-प्रतिक्रिया के बाद एक्सेस करने का प्रयास करें, तो आपको अपवाद मिलेगा)। अतः अस्थायी व्यूअर के भंडारण के लिए फ़ॉर्म व्यूअर और कंट्रोलर के बीच डेटा पास करने के लिए उपयुक्त हैं। अस्थायी डेटा को सत्र में संग्रहित किया जाना चाहिए ताकि इसे कई बार एक्सेस किया जा सके।


-1

मेरे मामले में नामस्थान में एक संघर्ष था, मेरे पास है:

using System.Web.Mvc;

तथा

using System.Collections.Generic;

मैं स्पष्ट रूप से Mvc का उपयोग करना चाहता हूं, इसलिए मैंने इसे इस प्रकार घोषित किया:

new System.Web.Mvc.SelectList(...)

1
जब तक मेरी आँखें मुझे धोखा नहीं देतीं, कोई भी SelectListअंदर नहीं है System.Collections.Generic
एरिक फिलिप्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.