Saya menggunakan MVC 3 dalam proyek saya, dan saya melihat perilaku yang sangat aneh.
Saya mencoba membuat bidang tersembunyi untuk nilai tertentu pada Model saya, masalahnya adalah karena alasan tertentu nilai yang ditetapkan pada bidang tersebut tidak sesuai dengan nilai dalam Model.
misalnya
Saya memiliki kode ini, hanya sebagai ujian:
<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>
Saya akan berpikir bahwa kedua bidang tersembunyi akan memiliki nilai yang sama. Apa yang saya lakukan adalah, tetapkan nilai ke 1 saat pertama kali saya menampilkan tampilan, dan kemudian setelah pengiriman saya menambah nilai bidang Model oleh 1.
Jadi, pertama kali saya membuat halaman kedua kontrol memiliki nilai 1, tetapi kedua kalinya nilai yang diberikan adalah ini:
<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />
Seperti yang Anda lihat, nilai pertama sudah benar, tetapi nilai kedua tampaknya sama dengan pertama kali saya menampilkan tampilan.
Apa yang saya lewatkan? Apakah * Untuk bantuan Html caching nilai dalam beberapa cara? Jika demikian, bagaimana saya bisa menonaktifkan caching ini?
Terima kasih atas bantuan Anda.
Jawaban:
Itu normal dan begitulah cara kerja pembantu HTML. Mereka pertama-tama menggunakan nilai permintaan POST dan setelah itu nilai dalam model. Ini berarti bahwa bahkan jika Anda mengubah nilai model dalam aksi controller Anda jika ada variabel yang sama dalam permintaan POST modifikasi Anda akan diabaikan dan nilai POSTed akan digunakan.
Salah satu solusi yang mungkin adalah menghapus nilai ini dari keadaan model dalam tindakan pengontrol yang mencoba mengubah nilai:
Kemungkinan lain adalah menulis bantuan HTML kustom yang akan selalu menggunakan nilai model dan mengabaikan nilai POST.
Dan kemungkinan lain:
sumber
Saya mengalami masalah yang sama ketika menulis Wizard yang menunjukkan bagian berbeda dari model yang lebih besar di setiap langkah.
Data dan / atau Kesalahan dari "Langkah 1" akan bercampur dengan "Langkah 2", dll, sampai akhirnya saya menyadari bahwa ModelState yang harus disalahkan.
Ini adalah solusi sederhana saya:
sumber
ModelState.Clear()
memecahkan masalah saya dengan permintaan POST berurutan dalam situasi yang sama.Kode ini tidak akan berfungsi
... karena HiddenFor always (!) membaca dari ModelState bukan model itu sendiri. Dan jika tidak menemukan kunci "Langkah" itu akan menghasilkan default untuk tipe variabel yang akan menjadi 0 dalam kasus ini
Ini solusinya. Saya menulisnya untuk diri saya sendiri tetapi tidak keberatan membagikannya karena saya melihat banyak orang berjuang dengan pembantu HiddenFor yang nakal ini.
Maka Anda cukup menggunakannya seperti biasa dari dalam tampilan Anda:
Perlu disebutkan itu berfungsi dengan koleksi juga.
sumber
Saya terlalu berjuang dengan situasi yang sama saya pikir, di mana saya menggunakan model yang sama antara panggilan, dan ketika saya mengubah properti model di backend. Padahal, itu tidak masalah bagi saya, jika saya menggunakan textboxfor atau hiddenfor.
Saya hanya memotong situasi dengan menggunakan skrip halaman untuk menyimpan nilai model sebagai variabel js, karena saya memerlukan hiddenfield untuk tujuan itu pada awalnya.
Tidak yakin apakah ini membantu tetapi pertimbangkan saja ..
sumber