ไม่มีรายการ ViewData ประเภท 'IEnumerable <SelectListItem>' ที่มีคีย์ 'xxx'


87

มีสองสามโพสต์เกี่ยวกับเรื่องนี้ใน Stack Overflow แต่ไม่มีคำตอบที่ดูเหมือนจะแก้ไขปัญหาในสถานการณ์ปัจจุบันของฉัน

ฉันมีหน้าที่มีตารางอยู่แต่ละแถวมีช่องข้อความจำนวนหนึ่งและรายการแบบเลื่อนลง รายการแบบเลื่อนลงทั้งหมดจำเป็นต้องใช้ข้อมูล SelectList เดียวกันดังนั้นฉันจึงตั้งค่าดังนี้:

ตัวควบคุม

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

ดู

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

ฉันใช้การตั้งค่านี้ในหลาย ๆ ที่ แต่ด้วยเหตุผลบางประการในมุมมองนี้ฉันได้รับข้อผิดพลาด:

ไม่มีรายการ ViewData ประเภท 'IEnumerable' ที่มีคีย์ 'submarket_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)") %>
Arvis

พบสิ่งนี้ในวันนี้และพบว่าอาร์กิวเมนต์ที่สองในตัวช่วย DropDownList ของฉันเป็นโมฆะตามการค้นหาด้านล่างจาก @jonathansewell
Ken Palmer

คำตอบ:


79

โอเคดังนั้นคำตอบจึงได้มาจากโพสต์อื่น ๆ เกี่ยวกับปัญหานี้และมันคือ:

หากคุณViewDataมีSelectListที่มีชื่อเดียวกับของคุณDropDownListคือ "submarket_0" ที่ Html ผู้ช่วยที่จะเติมของคุณDropDownListกับข้อมูลที่ถ้าคุณไม่ได้ระบุพารามิเตอร์ที่ 2ซึ่งในกรณีนี้คือ SelectList แหล่งที่มา

สิ่งที่เกิดขึ้นกับข้อผิดพลาดของฉันคือ:

เนื่องจากตารางที่มีรายการแบบเลื่อนลงอยู่ในมุมมองบางส่วนและViewDataมีการเปลี่ยนแปลงและไม่มีรายการที่SelectListฉันอ้างอิงอีกต่อไปHtmlHelper(แทนที่จะส่งข้อผิดพลาด) จึงพยายามค้นหา SelectList ที่เรียกว่า "submarket_0" ใน ViewData (GRRRR! !!) ซึ่งมันยังหาไม่เจอจากนั้นก็เกิดข้อผิดพลาด :)

กรุณาแก้ไขฉันถ้าฉันผิด


105
ฉันได้รับข้อผิดพลาดนี้เนื่องจากคอลเล็กชัน SelectListItems ของฉันสำหรับรายการแบบเลื่อนลงเป็นโมฆะซึ่งเป็นปัญหาเดียวกับที่ฉันคิด
Jonathan Sewell

6
สำหรับผู้อื่นที่ประสบปัญหานี้ให้รวมรายการแบบเลื่อนลงของคุณไว้ชั่วคราวในการตรวจสอบค่าว่างเช่น @if (ViewData ["ตลาดย่อย"]! = null) หากมุมมองนั้นแสดงผลโดยไม่มีข้อผิดพลาด (และไม่มีรายการแบบเลื่อนลงของคุณ) คุณจะพบปัญหาของคุณ ข้อผิดพลาด "ไม่มีรายการข้อมูลดู" ทำให้เข้าใจผิดอย่างมากในกรณีนี้
GDB

ฉันพบสิ่งนี้โดยใช้Ajax.ActionLinkไฟล์. เพียงแค่เพิ่มSelectList GetไปActionMethodที่มีการเรียกอาแจ็กซ์
เหม็น

อ๋อ! ฉันเปลี่ยนชื่อของรายการที่ฉันส่งผ่านเข้าสู่ ViewData จากคอนโทรลเลอร์และไม่ได้เปลี่ยนในมุมมอง นั่นเป็นข้อความแสดงข้อผิดพลาดที่ทำให้สับสนอย่างมาก!
neminem

1
@JonathanSewell ขอบคุณขอบคุณขอบคุณ! นี่คือปัญหาที่แท้จริงของฉัน
johnw182

30

คำถามเก่า แต่นี่คือคำอธิบายอื่นของปัญหา คุณจะได้รับข้อผิดพลาดนี้แม้ว่าคุณจะพิมพ์มุมมองอย่างมากและไม่ได้ใช้ 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
สวัสดีนี่เป็นปัญหาของฉันเหมือนกันเราจะทำอย่างไรถ้ารายการเป็นโมฆะ! ช่วยแนะนำหน่อยได้ไหม
transformer

4
@transformer สิ่งที่ง่ายที่สุดที่จะทำคือตั้ง Model.DropDownData เป็นรายการว่างแทน null หากเป็นไปไม่ได้คุณสามารถเปลี่ยนมาร์กอัปมีดโกนของคุณเพื่อตรวจสอบว่ารายการเป็นโมฆะหรือไม่หากเป็นเช่นนั้นให้แสดงรายการเลือกว่าง
hawkke

15

ฉันมีข้อผิดพลาดเดียวกันฉันคิดว่าปัญหาคือข้อความแสดงข้อผิดพลาดสับสนเพราะมันให้ชื่อคีย์ปลอม

ในกรณีของคุณควรระบุว่า "ไม่มีรายการ ViewData ประเภท" IEnumerable "ที่มีคีย์" ตลาดย่อย ""

ข้อผิดพลาดของฉันคือการสะกดผิดในรหัสมุมมอง ("ตลาดย่อย" ของคุณ) แต่ข้อความแสดงข้อผิดพลาดทำให้ฉันแทบคลั่ง

ฉันโพสต์คำตอบนี้เพราะฉันต้องการบอกว่าผู้คนที่กำลังมองหาข้อผิดพลาดนี้เช่นเดียวกับฉันว่าปัญหาคือมันไม่พบ IENumerable แต่ใน var ที่ควรจะค้นหา ("ตลาดย่อย" ในกรณีนี้) ไม่ได้อยู่ในหนึ่งแสดงให้เห็นความผิดพลาด ( "submarket_0")

คำตอบที่ได้รับการยอมรับนั้นน่าสนใจมาก แต่อย่างที่คุณบอกว่าการประชุมจะถูกนำไปใช้หากคุณไม่ได้ระบุพารามิเตอร์ที่ 2 ในกรณีนี้มีการระบุ แต่ไม่พบ var (ในกรณีของคุณเนื่องจากไม่มี viewdata ในกรณีของฉันเพราะ ฉันสะกดชื่อ var ผิด)

หวังว่านี่จะช่วยได้!


9

ปัญหาเกิดจากการโพสต์ย้อนกลับเมื่อคลิกปุ่มส่ง ดังนั้นในขณะที่โพสต์ข้อมูลเมื่อส่งให้คลิกอีกครั้งให้เขียนก่อนกลับ View ()

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

3

ตรวจสอบเนมสเปซ

คุณอาจกำหนดSystem.Web.Webpages.Html.SelectListItemในตัวควบคุมแทนการSystem.Web.Mvc.SelectListItem


1

ก็ใช้ได้เช่นกัน ตัวอย่างเช่น
==> ในไฟล์ "NumberController":

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();

เราจะเห็นข้อผิดพลาดนี้:

ไม่มีรายการ ViewData ประเภท 'IEnumerable' ที่มีคีย์ 'OperatorId'

* ดังนั้นให้แน่ใจว่ามีอยู่ของข้อความเหล่านี้ *


0

สำหรับฉันปัญหาที่ทำให้เกิดข้อผิดพลาดนี้เกิดขึ้นเมื่อฉันบันทึกแถวใหม่ไปยังฐานข้อมูล แต่ฟิลด์เป็นโมฆะ ในการออกแบบตารางฐานข้อมูลฟิลด์นั้นจะไม่เป็นโมฆะ ดังนั้นเมื่อฉันพยายามบันทึกแถวใหม่ด้วยค่า null สำหรับฟิลด์ที่ไม่เป็นค่าว่าง Visual Studio จึงโยนข้อผิดพลาดนี้ ดังนั้นฉันจึงตรวจสอบให้แน่ใจว่ามีการกำหนดค่าฟิลด์และปัญหาได้รับการแก้ไขแล้ว


0

ในกรณีของฉันฉันพบว่าฉันตั้งค่าวิธีการโพสต์เป็นแบบส่วนตัวโดยไม่ถูกต้อง หลังจากเปลี่ยนส่วนตัวเป็นสาธารณะ

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

เปลี่ยนไป

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

ตอนนี้ใช้งานได้ดี


0

สาเหตุไม่ได้ขัดกับไวยากรณ์มากกว่าการใช้วัตถุอย่างไม่เหมาะสม วงจรชีวิตของวัตถุใน ViewData, ViewBag และ View Life Cycle สั้นกว่าในเซสชัน ข้อมูลที่กำหนดไว้ใน formers จะสูญหายไปหลังจากการร้องขอการตอบกลับ (หากพยายามเข้าถึงหลังจากการร้องขอการตอบกลับคุณจะได้รับข้อยกเว้น) ดังนั้นผู้สร้างจึงเหมาะสมสำหรับการส่งผ่านข้อมูลระหว่าง View & Controller ในขณะที่ตัวหลังสำหรับจัดเก็บข้อมูลชั่วคราว ข้อมูลชั่วคราวควรจัดเก็บในเซสชันเพื่อให้สามารถเข้าถึงได้หลายครั้ง


-1

ในกรณีของฉันมีความขัดแย้งในเนมสเปซฉันมี:

using System.Web.Mvc;

และ

using System.Collections.Generic;

ฉันต้องการใช้ Mvc อย่างชัดเจนดังนั้นฉันจึงประกาศเป็น:

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

1
ยกเว้นกรณีที่ตาของฉันฉันหลอกไม่มีในSelectList System.Collections.Generic
Erik Philips
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.