Tidak ada item ViewData berjenis 'IEnumerable <SelectListItem>' yang memiliki kunci 'xxx'

87

Ada beberapa posting tentang ini di Stack Overflow tetapi tidak ada dengan jawaban yang tampaknya memperbaiki masalah dalam situasi saya saat ini.

Saya memiliki halaman dengan tabel di dalamnya, setiap baris memiliki sejumlah bidang teks dan dropdown. Semua dropdown perlu menggunakan data SelectList yang sama jadi saya telah mengaturnya sebagai berikut:

Kontroler

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

Melihat

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

Saya telah menggunakan pengaturan ini di banyak tempat, tetapi untuk beberapa alasan dalam tampilan khusus ini saya mendapatkan kesalahan:

Tidak ada item ViewData berjenis 'IEnumerable' yang memiliki kunci 'submarket_0'.

Jimbo
sumber
1
Apakah kamu sudah mencobanya? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>DropDownList membutuhkan IEnumerable<SelectListItem>.
LukLed
@LukLed - begitulah akhirnya saya menemukan sumber kesalahan :) serta informasi dari beberapa pos lainnya! Terima kasih
Jimbo
<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
Arvis
Menemukan ini hari ini dan menemukan argumen kedua di pembantu DropDownList saya adalah nol, sesuai temuan di bawah dari @jonathansewell.
Ken Palmer

Jawaban:

79

Oke, jadi jawabannya berasal dari beberapa posting lain tentang masalah ini dan itu adalah:

Jika Anda ViewDataberisi a SelectListdengan nama yang sama dengan DropDownListie "submarket_0", helper Html akan secara otomatis mengisi Anda DropDownListdengan data itu jika Anda tidak menentukan parameter ke-2 yang dalam hal ini adalah SelectList sumber.

Apa yang terjadi dengan kesalahan saya adalah:

Karena tabel yang berisi daftar drop-down berada dalam tampilan parsial dan ViewDatatelah diubah dan tidak lagi berisi SelectListI telah direferensikan, maka HtmlHelper(alih-alih memberikan kesalahan) mencoba menemukan SelectList yang disebut "submarket_0" di ViewData (GRRRR! !!) yang MASIH tidak dapat ditemukan, dan kemudian memberikan kesalahan pada itu :)

Harap perbaiki saya jika saya salah

Jimbo
sumber
105
Saya mendapat kesalahan ini karena koleksi SelectListItems saya untuk daftar drop-down adalah nol, yang merupakan masalah yang sama dengan yang saya pikirkan.
Jonathan Sewell
6
Untuk orang lain yang dihadapkan dengan masalah ini, untuk sementara bungkus daftar drop-down Anda dalam cek nol, misalnya @if (ViewData ["Submarkets"]! = Null). Jika tampilan kemudian dirender tanpa membuat kesalahan (dan tanpa daftar drop-down Anda), Anda akan mengidentifikasi masalah Anda. Kesalahan "tidak ada item data tampilan" sangat menyesatkan dalam kasus ini.
GDB
Saya mengalami ini menggunakan file Ajax.ActionLink. Cukup tambahkan SelectList Getke ActionMethodyang berisi panggilan Ajax.
Bau
Ya! Saya telah mengubah nama daftar yang saya berikan ke ViewData dari pengontrol, dan tidak mengubahnya dalam tampilan. Itu adalah pesan kesalahan yang sangat membingungkan!
neminem
1
@JonathanSewell terima kasih, terima kasih, terima kasih! Ini adalah masalah saya yang sebenarnya.
johnw182
30

Pertanyaan lama, tapi inilah penjelasan lain dari masalahnya. Anda akan mendapatkan kesalahan ini meskipun Anda memiliki tampilan yang sangat diketik dan tidak menggunakan ViewData untuk membuat daftar dropdown Anda. Alasan kesalahan dapat menjadi jelas saat Anda melihat sumber 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;
}

Jadi jika Anda memiliki sesuatu seperti:

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

Dan Model.DropDownDatabernilai null, MVC melihat melalui ViewData Anda untuk sesuatu yang bernama MyListdan menampilkan kesalahan jika tidak ada objek di ViewData dengan nama itu.

hawkke
sumber
1
Hai, ini masalah saya juga, Apa yang harus kita lakukan jika daftarnya nol! dapatkah Anda menyarankan sesuatu,
transformator
4
@transformer Hal termudah untuk dilakukan adalah menyetel Model.DropDownData ke daftar kosong, bukan null. Jika itu tidak memungkinkan, Anda dapat mengubah markup pisau cukur Anda untuk memeriksa apakah daftar tersebut nol, dan jika demikian, buat daftar pilih kosong.
hawkke
15

Saya mengalami kesalahan yang sama, saya pikir masalahnya adalah teks kesalahan itu membingungkan , karena memberikan nama kunci yang salah.

Dalam kasus Anda Seharusnya dikatakan "Tidak ada item ViewData dengan tipe 'IEnumerable' yang memiliki kunci" Submarkets "".

Kesalahan saya adalah salah mengeja dalam kode tampilan ("Sub-pasar" Anda), tetapi teks kesalahan membuat saya gila.

Saya memposting jawaban ini karena saya ingin mengatakan bahwa orang-orang yang mencari kesalahan ini, seperti saya, bahwa masalahnya adalah tidak menemukan IENumerable, tetapi di var yang seharusnya mencarinya ("Sub-pasar" dalam kasus ini), tidak di salah satu yang ditampilkan karena kesalahan ("submarket_0") .

Jawaban yang diterima sangat menarik, tetapi seperti yang Anda katakan, konvensi diterapkan jika Anda tidak menentukan parameter ke-2, dalam hal ini telah ditentukan, tetapi var tidak ditemukan (dalam kasus Anda karena viewdata tidak memilikinya, dalam kasus saya karena Saya salah mengeja nama var)

Semoga ini membantu!

Peto
sumber
9

Masalahnya karena post back terjadi pada klik tombol submit. Jadi saat memposting data di submit klik lagi tulis sebelum kembali View ()

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

Periksa Namespace.

Anda dapat menetapkan System.Web.Webpages.Html.SelectListItem di Controller, bukan System.Web.Mvc.SelectListItem .

MovGP0
sumber
1

Ini juga oke; Misalnya:
==> Dalam file "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();
}

==> Dalam file Tampilan (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>

Sekarang jika kita menghapus pernyataan ini:

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

dari belakang pernyataan berikut (di pengontrol kami):

return View();

kita akan melihat kesalahan ini:

Tidak ada item ViewData berjenis 'IEnumerable' yang memiliki kunci 'OperatorId'.

* Jadi pastikan ada pernyataan ini. *

Morteza
sumber
0

Bagi saya, masalah yang menyebabkan kesalahan ini muncul saat saya menyimpan baris baru ke database, tetapi bidangnya kosong. Dalam desain tabel database, field tersebut NOT NULL. Jadi ketika saya mencoba untuk menyimpan baris baru dengan nilai null untuk bidang bukan-null, Visual Studio melemparkan kesalahan ini. Jadi, saya memastikan bahwa bidang tersebut diberi nilai, dan masalahnya telah diperbaiki.

Thuy
sumber
0

Dalam kasus saya, saya menemukan bahwa saya salah mengatur metode posting sebagai pribadi. setelah mengubah pribadi menjadi publik.

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

mengubah

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

Sekarang bekerja dengan baik.

Mohammed Sabbir
sumber
0

Penyebabnya tidak bertentangan dengan sintaks daripada penggunaan objek yang tidak tepat. Siklus Hidup objek di ViewData, ViewBag, & View Siklus Hidup lebih pendek daripada di sesi. Data yang ditentukan dalam pembentuk akan hilang setelah permintaan-tanggapan (jika mencoba mengakses setelah permintaan-tanggapan, Anda akan mendapatkan pengecualian). Jadi pembentuk cocok untuk melewatkan data antara View & Controller sedangkan yang terakhir untuk menyimpan data sementara. Data sementara harus disimpan dalam sesi sehingga dapat diakses berkali-kali.

sdfs
sumber
-1

Dalam kasus saya, ada konflik di ruang nama, saya punya:

using System.Web.Mvc;

dan

using System.Collections.Generic;

Saya secara eksplisit ingin menggunakan Mvc jadi saya menyatakannya sebagai:

new System.Web.Mvc.SelectList(...)
Solusi IndieTech
sumber
1
Kecuali jika mata saya menipu saya, tidak ada yang SelectListmasuk System.Collections.Generic.
Erik Philips