Saya mencoba mengisi daftar dropdown dari database yang dipetakan dengan Linq-2-SQL, menggunakan ASP.NET MVC 2, dan terus mendapatkan kesalahan ini.
Saya sangat bingung karena saya mendeklarasikan variabel tipe IEnumerable<SelectListItem>
pada baris kedua, tetapi kesalahan membuat saya berpikir ini tidak terjadi. Saya merasa ini harus sangat sederhana, tetapi saya berjuang. Bantuan apa pun dihargai.
Berikut ini bagian-bagian menarik dari pengontrol saya:
public ActionResult Create()
{
var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;
return View();
}
Dan inilah bagian-bagian menarik dari pandangan saya:
<div class="editor-label">
<%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
<%: Html.DropDownList("basetype") %>
<%: Html.ValidationMessageFor(model => model.basetype) %>
</div>
Ini adalah tindakan POST ketika mengirimkan Formulir
// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
if (ModelState.IsValid)
{
try
{
// TODO: Add insert logic here
var db = new DB();
db.Meals.InsertOnSubmit(meal);
db.SubmitChanges();
return RedirectToAction("Index");
}
catch
{
return View(meal);
}
}
else
{
return View(meal);
}
}
Terima kasih.
asp.net-mvc
JBibbs
sumber
sumber
Jawaban:
Saya memiliki masalah yang sama, dan akhirnya saya mendapat jawabannya ...
Masalahnya adalah bahwa dalam tindakan POST, setelah mengirimkan formulir, ModelState tidak valid, atau menangkap kesalahan dalam coba / tangkap, sehingga tampilan dikembalikan. Tapi kali ini tampilan belum
ViewData["basetype"]
diatur dengan benar.Anda perlu mengisinya lagi, mungkin dengan kode yang sama yang digunakan sebelumnya, jadi ulangi ini:
sebelum
return View(meal)
dalam[HttpPost]
metode.tepatnya ini akan menyelesaikan masalah Anda:
Saya tahu pertanyaan ini sudah sangat lama, tetapi saya datang ke sini hari ini dengan masalah yang sama, sehingga orang lain bisa datang ke sini nanti ...
sumber
Anda akan menerima kesalahan ini jika SelectList adalah nol.
sumber
ModelState.IsValid==false
sehingga Anda mengembalikan modelreturn View(model)
tetapi tidak mengisi kembali sumber SelectList Anda sebelum kembali dari POST. Karena tidak ada ViewState ala WebForms, tidak ada sumber bagi@Html.DropDown
helper untuk membangun kembali yang terpilih. Anda harus mengisi daftar sumber itu SETIAP kali Anda mengembalikan tampilan ke klien tidak hanya di GET.Saya baru saja menemukan masalah ini dan artikel ini membantu saya melewatinya - http://odetocode.com/Blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx
Kemungkinan besar penyebabnya bahwa koleksi Anda dihuni kembali setelah po
sumber
Untuk pembaca masa depan, jika Anda menggunakan pisau cukur, cobalah untuk mengubah jenis item daftar pilih dari Daftar ke IEnumerable.
Dari
Untuk
sumber
Coba tambahkan string untuk nama daftar dropdown Anda sebagai parameter pertama, dan keluarkan item dari viewdata Anda:
Berikut ini juga metode ekstensi yang dapat Anda gunakan sehingga daftar dropdown diatur dalam gaya yang mirip dengan cara Anda melakukan kontrol lainnya:
Sebagai contoh
sumber
Anda mengatur koleksi sebagai item dalam kamus ViewData dan mencoba untuk mengambilnya sebagai properti pada model. Perbaikan sederhana adalah dengan merujuknya dengan cara yang sama seperti Anda mengaturnya:
Atau, kode di bawah ini menggunakan tampilan yang sangat diketik:
Kemudian, dalam tampilan yang sangat Anda ketik:
sumber
Jika Anda menggunakan
Html.DropDownList()
metode - kesalahan yang sama dapat terjadi, jika item ViewData / Viewbag Anda tidak disetel, seperti yang dijawab @Peto.Tapi itu mungkin tidak diatur jika controller set item dengan benar, tetapi dalam tampilan utama Anda menggunakan panggilan viw parsial dengan nilai-nilai ViewDataDictionary baru.
jika sudah,
@Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })
maka sebagian tampilan Anda tidak akan melihatViewData
danViewBag
data, hapusnew ViewDataDictionary()
parametersumber
Untuk pembaca masa depan,
Saya menemukan masalah hari ini dan tidak bisa memperbaikinya. Ternyata menjadi sangat sederhana. Saya bekerja dengan tampilan tabel +. Ketika saya memperbarui tabel (menambahkan beberapa kolom) saya lupa memperbarui (menjatuhkan dan membuat ulang) tampilan, yang menyebabkan masalah bagi saya. Semoga ini bisa membantu seseorang.
sumber
Saya mendapat kesalahan yang sama hari ini dan solusi saya adalah membuat model "valid".
Dalam kasus saya, setelah pengguna mengirim dengan mengeklik "simpan", saya mendapat status model: tidak valid jika pengguna memasukkan "0", tetapi status model akan valid jika pengguna memasukkan "0,0".
Jadi saya mengganti metode "IsValid" untuk mengembalikan true bahkan pengguna key-in "0".
Semoga ini bisa membantu.
sumber