Model saya memiliki boolean yang harus nullable
public bool? Foo
{
get;
set;
}
jadi di Razor cshtml saya, saya punya
@Html.CheckBoxFor(m => m.Foo)
kecuali itu tidak berhasil. Juga tidak melakukan casting dengan (bool). Jika aku melakukan
@Html.CheckBoxFor(m => m.Foo.Value)
itu tidak membuat kesalahan, tetapi tidak mengikat ke model saya saat diposting dan foo disetel ke null. Apa cara terbaik untuk menampilkan Foo di halaman dan membuatnya terikat ke model saya di postingan?
asp.net-mvc-3
razor
nullable
DMulligan
sumber
sumber
Jawaban:
Saya mendapatkannya untuk dikerjakan
dan kemudian membuat Boolean.cshtml di folder EditorTemplates saya dan menempel
dalam.
sumber
HasValue
properti nullable , tetapi bukan nilai boolean yang sebenarnya. Ini akan membuat kotak centang jika terlepas dari apa nilai dasarnya. Jika nullable memiliki nilai, nilainya akan selalu benar.Menemukan jawaban dalam pertanyaan serupa - Rendering Nullable Bool as CheckBox . Ini sangat mudah dan hanya berfungsi:
Ini seperti jawaban yang diterima dari @afinkelstein kecuali kita tidak memerlukan 'template editor' khusus
sumber
Saya ada
bool? IsDisabled { get; set; }
di Model. Disisipkan jika di View.sumber
Mengapa? Ini tidak masuk akal. Kotak centang memiliki dua status: dicentang / tidak dicentang, atau Benar / Salah jika Anda mau. Tidak ada negara ketiga.
Atau tunggu Anda menggunakan model domain dalam tampilan Anda, bukan model tampilan? Itu masalahmu. Jadi, solusi bagi saya adalah menggunakan model tampilan di mana Anda akan mendefinisikan properti boolean sederhana:
dan sekarang Anda akan meminta tindakan pengontrol Anda meneruskan model tampilan ini ke tampilan dan membuat kotak centang yang sesuai.
sumber
Memperumit primitif dengan bidang tersembunyi untuk memperjelas apakah False atau Null tidak disarankan.
Kotak centang bukanlah yang seharusnya Anda gunakan - kotak centang hanya memiliki satu status: Dicentang . Jika tidak, bisa jadi apa saja.
Ketika bidang database Anda adalah boolean nullable (
bool?
), UX harus menggunakan 3-Radio Buttons, di mana tombol pertama mewakili "Checked", tombol kedua mewakili "Not Checked" dan tombol ketiga mewakili null Anda, apa pun semantiknya null artinya. Anda dapat menggunakan daftar<select><option>
tarik-turun untuk menyelamatkan real estat, tetapi pengguna harus mengeklik dua kali dan pilihannya tidak langsung jelas.RadioButtonList, didefinisikan sebagai ekstensi bernama RadioButtonForSelectList, membangun tombol radio untuk Anda, termasuk nilai yang dipilih / dicentang, dan menyetel
<div class="RBxxxx">
sehingga Anda dapat menggunakan css untuk membuat tombol radio Anda menjadi horizontal (display: inline-block), vertikal, atau dalam gaya tabel (display: inline-block; width: 100px;)Dalam model (saya menggunakan string, string untuk definisi kamus sebagai contoh pedagogis. Anda dapat menggunakan bool ?, string)
sumber
Bagi saya, solusinya adalah mengubah model tampilan. Pertimbangkan Anda sedang mencari faktur. Faktur ini bisa dibayar atau tidak. Jadi, penelusuran Anda memiliki tiga opsi: Berbayar, Belum Dibayar, atau "Saya tidak peduli".
Saya awalnya menetapkan ini sebagai bool? bidang:
Ini membuat saya tersandung pada pertanyaan ini. Saya akhirnya membuat tipe Enum dan saya menangani ini sebagai berikut:
Tentu saja saya membungkusnya dengan label dan memiliki teks yang ditentukan, maksud saya inilah opsi lain untuk dipertimbangkan.
sumber
Kotak centang hanya menawarkan 2 nilai (benar, salah). Boolean nullable memiliki 3 nilai (true, false, null) sehingga tidak mungkin melakukannya dengan kotak centang.
Pilihan yang baik adalah menggunakan drop-down.
Model
Kontroler
Melihat
sumber
Saya benar-benar akan membuat template untuk itu dan menggunakan template itu dengan EditorFor ().
Inilah cara saya melakukannya:
Buat template Saya, yang pada dasarnya adalah tampilan parsial yang saya buat di direktori EditorTemplates, di bawah Bersama, di bawah Nama Tampilan sebagai (misalnya)
CheckboxTemplate
::Gunakan seperti ini (dalam tampilan apa pun):
@ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
Itu saja.
Template sangat kuat dalam MVC, gunakanlah .. Anda dapat membuat seluruh halaman sebagai template, yang akan Anda gunakan dengan
@Html.EditorFor()
; asalkan Anda meneruskan model tampilan dalam ekspresi lambda ..sumber
Pendekatan terbersih yang dapat saya hasilkan adalah memperluas ekstensi yang tersedia
HtmlHelper
sementara masih menggunakan kembali fungsionalitas yang disediakan oleh kerangka kerja.Saya bereksperimen dengan 'membentuk' ekspresi untuk memungkinkan langsung lolos ke native
CheckBoxFor<Expression<Func<T, bool>>>
tetapi saya rasa itu tidak mungkin.sumber
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
dan berhasil dengan luar biasa.Saya memiliki masalah serupa di masa lalu.
Buat input Kotak Centang dalam HTML, dan setel atribut name = "Foo" Ini masih harus dikirim dengan benar.
sumber
Cukup periksa nilai null dan kembalikan false padanya:
sumber
Saya juga menghadapi masalah yang sama. Saya mencoba pendekatan berikut untuk menyelesaikan masalah karena saya tidak ingin mengubah DB dan menghasilkan EDMX lagi.
sumber
Saat membuat EditorTemplate untuk model yang berisi bool nullable ...
Bagi bool nullable menjadi 2 boolean:
Di dalam template editor:
Jangan memposting balik properti asli Foo, karena itu sekarang dihitung dari FooIsNull dan FooCheckbox.
sumber
Semua jawaban di atas datang dengan masalahnya sendiri. Cara termudah / terbersih IMO adalah membuat pembantu
MVC5 Razor
App_Code / Helpers.cshtml
Pemakaian
Dalam skenario saya, kotak centang nullable berarti bahwa anggota staf belum mengajukan pertanyaan kepada klien, jadi pertanyaan itu dibungkus
.checkbox-nullable
sedemikian rupa sehingga Anda dapat menyesuaikan gaya dengan tepat dan membantu pengguna akhir mengidentifikasi bahwa itu bukantrue
ataufalse
CSS
sumber
Metode ekstensi:
sumber
Tombol radio berguna, tetapi tidak memungkinkan Anda untuk membatalkan pilihan . Jika Anda menginginkan perilaku ini, pertimbangkan untuk menggunakan drop-down / pilih. Kode berikut akan menghasilkan
SelectList
dan ini mengikat berhasil ke boolean nullable:sumber
sumber
Anda bisa mencoba seperti ini
sumber
Ini adalah pertanyaan lama, dan jawaban yang ada menjelaskan sebagian besar alternatif. Tapi ada satu pilihan sederhana, apakah Anda punya bool? di viewmodel Anda, dan Anda tidak peduli dengan null di UI Anda:
sumber