Saya memiliki model tampilan berikut
public class ProjectVM
{
....
[Display(Name = "Category")]
[Required(ErrorMessage = "Please select a category")]
public int CategoryID { get; set; }
public IEnumerable<SelectListItem> CategoryList { get; set; }
....
}
dan metode pengontrol berikut untuk membuat Proyek baru dan menetapkan Category
public ActionResult Create()
{
ProjectVM model = new ProjectVM
{
CategoryList = new SelectList(db.Categories, "ID", "Name")
}
return View(model);
}
public ActionResult Create(ProjectVM model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// Save and redirect
}
dan dalam tampilan
@model ProjectVM
....
@using (Html.BeginForm())
{
....
@Html.LabelFor(m => m.CategoryID)
@Html.DropDownListFor(m => m.CategoryID, Model.CategoryList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryID)
....
<input type="submit" value="Create" />
}
Tampilan ditampilkan dengan benar tetapi ketika mengirimkan formulir, saya mendapatkan pesan kesalahan berikut
InvalidOperationException: Item ViewData yang memiliki kunci 'CategoryID' berjenis 'System.Int32' tetapi harus berjenis 'IEnumerable <SelectListItem>'.
Kesalahan yang sama terjadi dengan @Html.DropDownList()
metode ini, dan jika saya meneruskan SelectList menggunakan ViewBag
atau ViewData
.
menurut jawaban stephens (user3559349) , ini bisa berguna:
atau di ProjectVM:
sumber
Paling Mungkin Menyebabkan semacam kesalahan saat mengarahkan ke halaman Anda dan Anda tidak menginisialisasi daftar tarik-turun model Anda lagi.
Pastikan Anda menginisialisasi drop-down baik di konstruktor model atau setiap kali sebelum Anda mengirim model tersebut ke halaman.
Jika tidak, Anda perlu mempertahankan status daftar drop-down baik melalui view bag atau melalui hidden value helers.
sumber
Saya memiliki masalah yang sama, saya mendapatkan ModelState yang tidak valid saat mencoba mengirim formulir. Bagi saya, ini disebabkan oleh pengaturan CategoryId ke int, ketika saya mengubahnya menjadi string ModelState itu valid dan metode Buat bekerja seperti yang diharapkan.
sumber
Oke, jawaban terekam poster dengan rapi menjelaskan mengapa kesalahan terjadi, tetapi tidak bagaimana membuatnya bekerja. Saya tidak yakin itu benar-benar jawaban, tetapi itu mengarahkan saya ke arah yang benar.
Saya mengalami masalah yang sama dan menemukan cara yang apik untuk mengatasinya. Saya akan mencoba menangkapnya di sini. Penafian - Saya mengerjakan halaman web sekali setahun atau lebih dan benar-benar tidak tahu apa yang saya lakukan sebagian besar waktu. Jawaban ini sama sekali tidak boleh dianggap sebagai jawaban "ahli", tetapi berhasil dengan sedikit kerja ...
Mengingat bahwa saya memiliki beberapa objek data (kemungkinan besar Objek Transfer Data) yang ingin saya gunakan daftar drop-down untuk memberikan nilai yang valid untuk suatu bidang, seperti:
Kemudian ViewModel terlihat seperti ini:
Masalah sebenarnya di sini, seperti yang dijelaskan @Stephen dengan fasih di atas, adalah daftar pilihan tidak diisi pada metode POST di pengontrol. Jadi metode pengontrol Anda akan terlihat seperti ini:
Itu dia. Ini BUKAN kode yang berfungsi, saya salin / tempel dan edit untuk membuatnya sederhana, tetapi Anda mendapatkan idenya. Jika anggota data dalam model data asli dan model tampilan turunan memiliki nama yang sama, UpdateModel () melakukan pekerjaan luar biasa dengan hanya mengisi data yang tepat untuk Anda dari nilai FormCollection.
Saya memposting ini di sini sehingga saya dapat menemukan jawabannya ketika saya pasti mengalami masalah ini lagi - semoga ini akan membantu orang lain juga.
sumber
Dalam kasus saya, ID pertama dalam daftar saya adalah nol, begitu saya mengubah ID menjadi mulai dari 1, itu berhasil.
sumber