Perhatian: Pertanyaan ini sudah lebih dari sembilan tahun!
Pilihan terbaik Anda adalah mencari pertanyaan yang lebih baru, atau mencari jawaban di bawah ini untuk mencari versi spesifik MVC Anda, karena banyak jawaban di sini sudah usang sekarang.
Jika Anda menemukan jawaban yang berfungsi untuk versi Anda, pastikan jawabannya berisi versi MVC yang Anda gunakan.
(Pertanyaan awal dimulai di bawah)
Ini agak aneh bagi saya, tetapi sejauh yang saya tahu, ini adalah bagaimana Anda melakukannya.
Saya memiliki koleksi objek, dan saya ingin pengguna memilih satu atau lebih dari itu. Ini mengatakan kepada saya "formulir dengan kotak centang." Objek saya tidak memiliki konsep "terpilih" (itu adalah POCO yang belum sempurna yang dibentuk oleh deserialisasi panggilan wcf). Jadi, saya melakukan hal berikut:
public class SampleObject{
public Guid Id {get;set;}
public string Name {get;set;}
}
Dalam tampilan:
<%
using (Html.BeginForm())
{
%>
<%foreach (var o in ViewData.Model) {%>
<%=Html.CheckBox(o.Id)%> <%= o.Name %>
<%}%>
<input type="submit" value="Submit" />
<%}%>
Dan, dalam controller, ini adalah satu-satunya cara saya bisa melihat untuk mengetahui objek apa yang diperiksa pengguna:
public ActionResult ThisLooksWeird(FormCollection result)
{
var winnars = from x in result.AllKeys
where result[x] != "false"
select x;
// yadda
}
Yang aneh di tempat pertama, dan kedua, untuk barang-barang yang diperiksa pengguna, FormCollection mendaftar nilainya sebagai "benar salah" daripada hanya benar.
Jelas, saya kehilangan sesuatu. Saya pikir ini dibangun dengan ide dalam pikiran bahwa objek dalam koleksi yang ditindaklanjuti dalam bentuk html diperbarui menggunakan UpdateModel()
atau melalui ModelBinder.
Tetapi objek saya tidak diatur untuk ini; apakah itu berarti bahwa ini adalah satu-satunya cara? Apakah ada cara lain untuk melakukannya?
sumber
Jawaban:
Html.CheckBox melakukan sesuatu yang aneh - jika Anda melihat sumber di halaman hasil, Anda akan melihat ada
<input type="hidden" />
yang dihasilkan di samping setiap kotak centang, yang menjelaskan nilai "true false" yang Anda lihat untuk setiap elemen formulir.Coba ini, yang pasti berfungsi pada ASP.NET MVC Beta karena saya baru saja mencobanya.
Letakkan ini dalam tampilan alih-alih menggunakan Html.CheckBox ():
Kotak centang Anda semuanya dipanggil
selectedObjects
, danvalue
kotak centang masing-masing adalah GUID dari objek yang sesuai.Kemudian poskan ke tindakan pengontrol berikut (atau sesuatu yang serupa yang melakukan sesuatu yang bermanfaat alih-alih Response.Write ())
Contoh ini hanya akan menulis GUID kotak yang Anda centang; ASP.NET MVC memetakan nilai-nilai GUID dari kotak centang yang dipilih ke dalam
Guid[] selectedObjects
parameter untuk Anda, dan bahkan mem-parsing string dari koleksi Request.Form menjadi objek-objek GUID yang di-instan, yang menurut saya agak bagus.sumber
HtmlHelper menambahkan input tersembunyi untuk memberi tahu pengontrol tentang status Tidak Dicentang. Jadi untuk memiliki status yang diperiksa benar:
sumber
Jika Anda bertanya-tanya MENGAPA mereka memasukkan bidang tersembunyi dengan nama yang sama dengan kotak centang alasannya adalah sebagai berikut:
Komentar dari sourcecode MVCBetaSource \ MVC \ src \ MvcFutures \ Mvc \ ButtonsAndLinkExtensions.cs
Saya kira di balik layar mereka perlu tahu ini untuk mengikat parameter pada metode aksi pengontrol. Anda kemudian dapat memiliki boolean tri-state saya kira (terikat ke parameter bool nullable). Saya belum mencobanya tetapi saya berharap itulah yang mereka lakukan.
sumber
Anda juga harus menggunakan
<label for="checkbox1">Checkbox 1</label>
karena dengan begitu orang dapat mengklik teks label serta kotak centang itu sendiri. Ini juga lebih mudah untuk ditata dan setidaknya di IE akan disorot ketika Anda tab melalui kontrol halaman.Ini bukan hanya 'oh saya bisa melakukannya'. Ini merupakan peningkatan pengalaman pengguna yang signifikan. Bahkan jika tidak semua pengguna tahu mereka bisa mengklik label banyak yang mau.
sumber
Saya terkejut tidak ada jawaban ini menggunakan fitur built in MVC untuk ini.
Saya menulis posting blog tentang ini di sini , yang bahkan sebenarnya menautkan label ke kotak centang. Saya menggunakan folder EditorTemplate untuk melakukan ini dengan cara yang bersih dan modular.
Anda hanya akan berakhir dengan file baru di folder EditorTemplate yang terlihat seperti ini:
dalam tampilan Anda yang sebenarnya, tidak perlu mengulang ini, cukup 1 baris kode:
Kunjungi posting blog saya untuk lebih jelasnya.
sumber
+1
dan + birInilah yang saya lakukan.
Melihat:
Pengendali:
Saya menemukan metode bantuan html. * Tidak begitu berguna dalam beberapa kasus, dan saya lebih baik melakukannya dalam HTML biasa. Karena ini salah satunya, yang lain yang muncul di benak saya adalah tombol radio.
Sunting: ini pada Pratinjau 5, jelas YMMV antara versi.
sumber
Mereka tampaknya memilih untuk membaca nilai pertama saja, jadi ini "benar" ketika kotak centang dicentang, dan "salah" ketika hanya nilai tersembunyi yang disertakan. Ini mudah diambil dengan kode seperti ini:
sumber
@Dylan Beattie Great Find !!! Terima kasih banyak Untuk memperluas lebih jauh, teknik ini juga berfungsi sempurna dengan pendekatan View Model. MVC sangat keren, cukup pintar untuk mengikat array Guids ke properti dengan nama yang sama dari objek Model yang terikat ke View. Contoh:
ViewModel:
Melihat:
Pengendali:
Siapa pun yang akrab dengan filosofi Model Tampilan akan bersukacita, ini berfungsi seperti Champ!
sumber
Saya juga ingin menunjukkan bahwa Anda dapat memberi nama pada masing-masing kotak centang nama yang berbeda, dan meminta nama itu menjadi bagian dari parameter hasil tindakan.
Contoh,
Melihat:
Pengendali:
Nilai-nilai dari tampilan diteruskan ke tindakan karena namanya sama.
Saya tahu solusi ini tidak ideal untuk proyek Anda, tetapi saya pikir saya akan membuang ide itu ke sana.
sumber
Dari Pengendali:
sumber
Masalah ini terjadi di rilis 1.0 juga. Html.Checkbox () menyebabkan bidang tersembunyi lainnya ditambahkan dengan nama / id yang sama dengan kotak centang asli Anda. Dan ketika saya mencoba memuat array kotak centang menggunakan document.GetElemtentsByName (), Anda dapat menebak bagaimana segala sesuatu menjadi kacau. Ini aneh.
sumber
Dari apa yang dapat saya kumpulkan, model tidak ingin menebak apakah dicentang = benar atau salah, saya menyiasatinya dengan menetapkan atribut nilai pada elemen kotak centang dengan jQuery sebelum mengirimkan formulir seperti ini:
Dengan cara ini, Anda tidak perlu elemen tersembunyi hanya untuk menyimpan nilai kotak centang.
sumber
Saya tahu bahwa pertanyaan ini ditulis ketika MVC3 tidak keluar, tetapi bagi siapa pun yang datang ke pertanyaan ini dan menggunakan MVC3, Anda mungkin menginginkan cara "benar" untuk melakukan ini.
Sementara saya berpikir melakukan keseluruhan
hal yang hebat dan bersih, dan bekerja pada semua versi MVC, masalahnya adalah tidak memperhitungkan budaya (seolah-olah itu benar-benar penting dalam kasus bool).
Cara "benar" untuk mengetahui nilai bool, setidaknya di MVC3, adalah dengan menggunakan ValueProvider.
Saya melakukan ini di salah satu situs klien saya ketika saya mengedit izin:
Sekarang, keindahan dari ini adalah Anda dapat menggunakan ini dengan hampir semua jenis sederhana, dan itu bahkan akan benar berdasarkan pada Budaya (pikirkan uang, desimal, dll).
ValueProvider adalah apa yang digunakan saat Anda membentuk Tindakan seperti ini:
tetapi ketika Anda mencoba untuk membuat daftar ini secara dinamis dan memeriksa nilainya, Anda tidak akan pernah tahu ID pada waktu kompilasi, jadi Anda harus memprosesnya dengan cepat.
sumber
Cara termudah untuk melakukannya adalah ...
Anda menetapkan nama dan nilai.
<input type="checkbox" name="selectedProducts" value="@item.ProductId" />@item.Name
Kemudian saat mengirim ambil nilai kotak centang dan simpan dalam array int. maka Fungsi LinQ yang sesuai. Itu dia..
sumber
Sama dengan jawaban nautic20, cukup gunakan MVC default model binding list checkbox dengan nama yang sama dengan properti kumpulan string / int / enum di ViewModel. Hanya itu saja.
Tetapi satu masalah perlu ditunjukkan. Di setiap komponen kotak centang, Anda tidak boleh memasukkan "Id" di dalamnya yang akan mempengaruhi pengikatan model MVC.
Kode berikut akan berfungsi untuk penjilidan model:
Kode berikut tidak akan mengikat ke model (perbedaan di sini adalah id yang ditetapkan untuk setiap kotak centang)
sumber
ini adalah apa yang saya lakukan untuk kehilangan nilai ganda saat menggunakan Html.CheckBox (...
dengan 4 kotak dicentang, tidak dicentang, tidak dicentang, dicentang ternyata benar, salah, salah, salah, benar, salah menjadi benar, salah, salah, benar. apa yang saya butuhkan
sumber
Bagaimana dengan sesuatu yang seperti ini?
sumber
Saat menggunakan kotak centang HtmlHelper, saya lebih suka bekerja dengan data formulir kotak centang yang diposting sebagai array. Saya tidak benar-benar tahu mengapa, saya tahu metode lain bekerja, tapi saya pikir saya lebih suka memperlakukan string yang dipisahkan koma sebagai array sebanyak mungkin.
Jadi melakukan tes 'diperiksa' atau benar adalah:
Melakukan cek palsu adalah:
Perbedaan utama adalah untuk digunakan
GetValues
karena ini kembali sebagai array.sumber
Lakukan ini pada
$(document).ready
:sumber
Solusi saya adalah:
Lebih banyak lagi dapat Anda temukan di sini: http://www.blog.mieten.pl/2010/12/asp-net-mvc-custom-checkbox-as-solution-of-string-was-not-not- diakui-as-a- valid-boolean /
sumber
Saya memiliki masalah yang hampir sama tetapi Nilai kembalinya Controller saya diblokir dengan Nilai lainnya.
Menemukan Solusi sederhana tetapi tampaknya agak kasar.
Cobalah untuk mengetik
Viewbag.
Kontroler Anda dan sekarang Anda memberinya nama sepertiViewbag.Checkbool
Sekarang beralihlah ke View dan coba ini
@Viewbag.Checkbool
dengan ini Anda akan mendapatkan nilai dari Controller.Parameter Kontroler saya terlihat seperti ini:
dan kotak centang saya akan diperbarui seperti ini:
sumber
Menggunakan @mmacaulay, saya membuat ini untuk bool:
Jika dicentang aktif = benar
Jika tidak dicentang aktif = salah
sumber