Saya menggunakan model yang berisi List sebagai properti. Saya mengisi daftar ini dengan item yang saya ambil dari SQL Server. Saya ingin List disembunyikan dalam tampilan dan diteruskan ke tindakan POST. Nanti saya mungkin ingin menambahkan lebih banyak item ke Daftar ini dengan jQuery yang membuat array tidak cocok untuk ekspansi nanti. Biasanya Anda akan menggunakan
@Html.HiddenFor(model => model.MyList)
untuk mencapai fungsi ini, tetapi untuk beberapa alasan List di POST selalu null.
Pertanyaan yang sangat sederhana, ada yang tahu kenapa MVC berperilaku seperti ini?
c#
asp.net
asp.net-mvc-3
hidden-field
Anton Smith
sumber
sumber
<input />
s?MyList
isinya?HiddenFor
hanya digunakan untuk satu masukan dalam satu waktu.Model.MyList
? Anda mungkin perlu melakukan beberapa serialisasi / deserialisasi pada daftar Anda secara manual.Jawaban:
Saya baru saja menemukan masalah ini dan menyelesaikannya hanya dengan melakukan hal berikut:
Dengan menggunakan for dan bukan foreach, pengikatan model akan bekerja dengan benar dan mengambil semua nilai tersembunyi Anda dalam daftar. Sepertinya cara termudah untuk mengatasi masalah ini.
sumber
@Html.HiddenFor(model => Model.ToGroups[i].RowId)
@Html.EditorFor(model => Model.ToGroups[i].Id)
diikuti oleh@Html.EditorFor(model => Model.ToGroups[i].Description)
di lain waktu - keduanya di loop-for. Dan pengontrol dapat memetakannya ke daftar model dengan bidang tersebut. Dan untuk memastikan tidak ada yang muncul di layar, cukup lilitkan di<div style="display: none;"></div>
for
-loop menjadi ini:for(int i = 0; i < Model.Departments.Count(); i++)
HiddenFor tidak seperti DisplayFor atau EditorFor. Itu tidak akan bekerja dengan koleksi, hanya nilai tunggal.
Anda dapat menggunakan helper Serialize HTML yang tersedia di proyek MVC Futures untuk membuat serial objek ke bidang Tersembunyi, atau Anda harus menulis kodenya sendiri. Solusi yang lebih baik adalah dengan membuat serialisasi ID dan mendapatkan kembali data dari database di postback.
sumber
Ini sedikit meretas, tetapi jika
@Html.EditorFor
atau@Html.DisplayFor
berfungsi untuk daftar Anda, jika Anda ingin memastikannya dikirim pada permintaan posting tetapi tidak terlihat, Anda bisa menatanya menggunakandisplay: none;
untuk menyembunyikannya, misalnya:sumber
Bagaimana dengan menggunakan Newtonsoft untuk deserialisasi objek menjadi string json dan kemudian memasukkannya ke dalam bidang Tersembunyi Anda misalnya ( Model.DataResponse.Entity.Commission adalah Daftar objek "CommissionRange" sederhana seperti yang akan Anda lihat di JSON)
Ditampilkan sebagai:
Dalam kasus saya, saya melakukan beberapa hal JS untuk mengedit json di bidang tersembunyi sebelum memposting kembali
Di pengontrol saya, saya kemudian menggunakan Newtonsoft lagi untuk deserialize:
sumber
Html.HiddenFor
dirancang hanya untuk satu nilai. Anda perlu menyusun daftar Anda dengan cara tertentu sebelum membuat bidang tersembunyi.Misalnya, jika daftar Anda berjenis string, Anda dapat menggabungkan daftar tersebut menjadi daftar yang dipisahkan koma, kemudian memisahkan daftar setelah posting kembali di pengontrol Anda.
sumber
Saya baru saja menemukan (setelah beberapa jam mencoba mencari tahu mengapa nilai model tidak kembali ke pengontrol) yang disembunyikan untuk harus mengikuti EditorFor.
Kecuali saya melakukan kesalahan lain, inilah yang saya temukan. Saya tidak akan membuat kesalahan lagi.
Dalam konteks Model yang berisi daftar kelas lain.
Ini TIDAK akan berhasil:
Dimana ini AKAN ......
sumber
Saya mulai menggali kode sumber untuk
HiddenFor
, dan saya pikir penghalang yang Anda lihat adalah bahwa objek kompleks AndaMyList
tidak secara implisit dapat diubah menjadi tipestring
, jadi kerangka kerja memperlakukanModel
nilai Anda sebagainull
dan membuatvalue
atribut kosong.sumber
Anda dapat melihat solusi ini .
Letakkan hanya HiddenFor di dalam EditorTemplate.
Dan dalam Pandangan Anda, tulis ini:
@Html.EditorFor(model => model.MyList)
Ini harus berhasil.
sumber
Menghadapi masalah yang sama. Tanpa for loop, itu hanya memposting elemen pertama dari daftar. Setelah melakukan iterasi melalui for loop, itu dapat menyimpan daftar lengkap dan memposting dengan sukses.
sumber
Pilihan lainnya adalah:
sumber
The
foreach
Loop bukannyafor
lingkaran mungkin menjadi solusi sedikit lebih bersih.sumber
Cara lain yang mungkin untuk memperbaikinya adalah dengan memberi setiap objek dalam Daftar Anda sebuah ID, lalu menggunakan
@Html.DropDownListFor(model => model.IDs)
dan mengisi larik yang menyimpan ID tersebut.sumber
mungkin terlambat, tetapi saya membuat metode ekstensi untuk bidang tersembunyi dari koleksi (dengan item tipe data sederhana):
Jadi begini:
Penggunaannya sesederhana:
sumber