Saya sedang mengerjakan aplikasi ASP.NET MVC 4. Aplikasi ini memiliki bentuk dasar. Model formulir saya terlihat seperti berikut:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
Dalam formulir saya, saya memiliki HTML berikut.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Saat saya memposting formulir, nilai Remember dalam model selalu salah. Namun, properti Name dalam model memiliki nilai. Saya telah menguji ini dengan menetapkan breakpoint sebagai berikut:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Saya tidak bisa memahaminya. Mengapa nilai Kotak Centang tidak disetel?
c#
asp.net-mvc-4
JQuery Mobile
sumber
sumber
Jawaban:
Akan menghasilkan:
Bagaimana cara kerjanya:
checkbox
tetap tidak dicentang, formulir hanya mengirimkanhidden
nilai (salah)true
untukbool
properti model<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Ini akan selalu mengirimkan nilai default, jika dicentang.
sumber
Karena Anda menggunakan Model.Name untuk mengatur nilainya. Saya berasumsi Anda melewati model tampilan kosong ke View.
Jadi nilai Remember adalah false, dan menyetel nilai pada elemen kotak centang menjadi false. Artinya ketika Anda kemudian memilih kotak centang, Anda memposting nilai "false" dengan formulir. Jika Anda tidak memilihnya, itu tidak akan diposting, jadi model defaultnya adalah false. Itulah mengapa Anda melihat nilai palsu dalam kedua kasus tersebut.
Nilai hanya diteruskan ketika Anda mencentang kotak pilih. Untuk melakukan kotak centang dalam penggunaan Mvc
atau jika Anda tidak ingin mengikat model ke tampilan.
Mvc melakukan sihir dengan bidang tersembunyi untuk mempertahankan nilai saat tidak dipilih.
Sunting, jika Anda benar-benar enggan melakukan itu dan ingin membuat elemen sendiri, Anda bisa melakukannya.
sumber
@Html.CheckboxFor
kode harus benar-benar menjadi@Html.CheckBoxFor
@(Model.Remember ? "checked=\"checked\"" : "")
tombol radio? atau apakah itu tidak mungkintype="radio"
, dan memilih yang ingin Anda pilih di HTML sama seperti di atas ,checked="checked"
. Perbedaannya adalah Anda akan memiliki banyak<input />
elemen dengan nama yang sama. Anda perlu mencari tahu yang mana yang akan menerapkan HTML tambahan.@Html.CheckBoxFor(x => x.Remember)
ini berhasil untuk sayaGunakan hanya ini
sumber
$(this).val($(this).is(":checked"));
Dari pada
menggunakan:
Itu akan memberi Anda kotak centang khusus untuk Ingat
sumber
Oke, kotak centangnya agak aneh. Saat Anda menggunakan helper Html, ini menghasilkan dua input kotak centang pada markup, dan keduanya akan diteruskan sebagai pasangan nama-nilai IEnumerable jika dicentang.
Jika tidak dicentang pada markup, itu akan diteruskan hanya dalam input tersembunyi yang memiliki nilai false.
Jadi misalnya pada markup yang Anda miliki:
Dan dalam tindakan pengontrol (pastikan namanya cocok dengan nama parameter kotak centang pada pengontrol):
Kemudian di pengontrol Anda dapat melakukan beberapa hal seperti:
Saya tahu ini bukanlah solusi yang elegan. Semoga seseorang di sini bisa memberikan beberapa petunjuk.
sumber
Untuk mengonversi nilai yang dikembalikan dari kotak centang dalam formulir menjadi properti Boolean, saya menggunakan konverter ValueProviderResult dalam build di ModelBinder kustom.
sumber
Jika bekerja dengan FormCollection daripada model, tugasnya bisa sesederhana:
sumber
Saya mengalami masalah serupa dan bisa mendapatkan kembali nilai kotak centang dengan menggunakan kotak centang, hiddenfor, dan JQuery kecil seperti:
sumber
Ini telah menjadi rasa sakit yang besar dan terasa seperti itu harus lebih sederhana. Inilah pengaturan dan solusi saya.
Saya menggunakan pembantu HTML berikut:
@Html.CheckBoxFor(model => model.ActiveFlag)
Kemudian, di pengontrol, saya memeriksa pengumpulan dan pemrosesan formulir yang sesuai:
sumber
user.IsActive = fc["IsActive"] != "false";
saya masih merasa kotor karena melakukan perbandingan string di atasnya.Saya baru saja mengalami ini (saya tidak percaya itu tidak mengikat / mati!)
Pokoknya!
Akan memposting nilai "on" atau "off".
Ini TIDAK AKAN mengikat ke boolean, tetapi Anda dapat melakukan solusi konyol ini!
sumber
sumber
Untuk MVC menggunakan Model. Model:
HTML:
Dalam fungsi [HttpPost], kita bisa mendapatkan propertinya.
sumber
Jika Anda benar-benar ingin menggunakan HTML biasa (untuk alasan apa pun) dan bukan ekstensi HtmlHelper bawaan, Anda dapat melakukannya dengan cara ini.
Dari pada
coba gunakan
Input kotak centang dalam HTML berfungsi sehingga ketika dicentang, mereka mengirim nilai, dan ketika tidak dicentang, mereka tidak mengirim apa pun sama sekali (yang akan menyebabkan ASP.NET MVC mundur ke nilai default dari lapangan,
false
). Selain itu, nilai kotak centang di HTML dapat berupa apa saja, tidak hanya benar / salah, jadi jika Anda benar-benar menginginkannya, Anda bahkan dapat menggunakan kotak centang untuk bidang string dalam model Anda.Jika Anda menggunakan built-in
Html.RenderCheckbox
, itu sebenarnya mengeluarkan dua input: kotak centang dan bidang tersembunyi sehingga nilai palsu dikirim ketika kotak centang tidak dicentang (bukan hanya tidak ada). Itu dapat menyebabkan beberapa situasi yang tidak terduga, seperti ini:sumber
Untuk beberapa kotak centang dengan nama yang sama ... Kode untuk menghapus salah yang tidak perlu:
Fungsi
Gunakan :
sumber
sumber
Ubah Ingat seperti ini
Gunakan nullable bool di controller dan fallback ke false di null seperti ini
sumber
Dalam kasus saya, saya tidak menyetel properti model "Ingat" dalam metode get. Periksa logika Anda di pengontrol. Anda mungkin melakukan hal yang sama. Saya harap bantuan ini!
sumber
Saya membaca jawaban lain dan tidak cukup berhasil - jadi inilah solusi yang saya dapatkan.
Formulir saya menggunakan
Html.EditorFor(e => e.Property)
untuk menghasilkan kotak centang, dan menggunakanFormCollection
di pengontrol, ini melewati nilai string'true,false'
di pengontrol.Ketika saya menangani hasil, saya menggunakan loop untuk menggilirnya - saya juga menggunakan
InfoProperty
instance untuk mewakili nilai model saat ini yang dinilai dari formulir.Jadi sebagai gantinya saya hanya memeriksa apakah string yang dikembalikan dimulai dengan kata
'true'
dan kemudian menetapkan variabel boolean ketrue
dan meneruskannya ke model pengembalian.sumber