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'.
<%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>
DropDownList membutuhkanIEnumerable<SelectListItem>
.<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
Jawaban:
Oke, jadi jawabannya berasal dari beberapa posting lain tentang masalah ini dan itu adalah:
Jika Anda
ViewData
berisi aSelectList
dengan nama yang sama denganDropDownList
ie "submarket_0", helper Html akan secara otomatis mengisi AndaDropDownList
dengan 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
ViewData
telah diubah dan tidak lagi berisiSelectList
I telah direferensikan, makaHtmlHelper
(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
sumber
Ajax.ActionLink
. Cukup tambahkanSelectList
Get
keActionMethod
yang berisi panggilan Ajax.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.DropDownData
bernilai null, MVC melihat melalui ViewData Anda untuk sesuatu yang bernamaMyList
dan menampilkan kesalahan jika tidak ada objek di ViewData dengan nama itu.sumber
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!
sumber
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");
sumber
Periksa Namespace.
Anda dapat menetapkan System.Web.Webpages.Html.SelectListItem di Controller, bukan System.Web.Mvc.SelectListItem .
sumber
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. *
sumber
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.
sumber
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.
sumber
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.
sumber
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(...)
sumber
SelectList
masukSystem.Collections.Generic
.