Variabel strCSSClass sering kali memiliki nilai tetapi terkadang kosong.
Saya tidak ingin menyertakan class = "" yang kosong dalam HTML elemen masukan ini, yang berarti jika strCSSClass kosong, saya tidak ingin atribut class = sama sekali.
Berikut ini adalah salah satu cara untuk melakukan atribut HTML bersyarat:
<input type="text" id="@strElementID" @(CSSClass.IsEmpty() ? "" : "class=" + strCSSClass) />
Apakah ada cara yang lebih elegan untuk melakukan ini? Khususnya di mana saya bisa mengikuti sintaks yang sama seperti yang digunakan di bagian lain dari elemen: class = "@ strCSSClass"?
sumber
Perhatikan Anda dapat melakukan sesuatu seperti ini (setidaknya di MVC3):
Apa yang saya yakini adalah menambahkan tanda kutip pisau cukur sebenarnya adalah browser. Seperti yang ditunjukkan Rism ketika menguji dengan MVC 4 (saya belum menguji dengan MVC 3 tetapi saya menganggap perilaku tidak berubah), ini sebenarnya menghasilkan
class=TopBorder
tetapi browser dapat mengurai ini dengan baik. Pengurai HTML agak memaafkan jika ada kutipan atribut yang hilang, tapi ini dapat rusak jika Anda memiliki spasi atau karakter tertentu .ATAU
Apa yang salah dengan memberikan kutipan Anda sendiri
Jika Anda mencoba menggunakan beberapa konvensi C # yang biasa untuk kutipan bertingkat, Anda akan mendapatkan lebih banyak kutipan daripada yang Anda tawar karena Razor mencoba melarikan diri dengan aman. Sebagai contoh:
Ini harus bernilai
<button type="button" style="border:0px">
tetapi Razor lolos dari semua output dari C # dan dengan demikian menghasilkan:Anda hanya akan melihat ini jika Anda melihat tanggapan melalui jaringan. Jika Anda menggunakan inspektur HTML, seringkali Anda benar-benar melihat DOM, bukan HTML mentah. Browser mengurai HTML ke dalam DOM, dan representasi DOM setelah penguraian sudah menerapkan beberapa hal bagus. Dalam hal ini, Browser melihat tidak ada tanda kutip di sekitar nilai atribut, tambahkan:
Namun dalam pemeriksa DOM kode karakter HTML ditampilkan dengan benar sehingga Anda benar-benar melihat:
Di Chrome, jika Anda mengklik kanan dan memilih Edit HTML, itu akan beralih kembali sehingga Anda dapat melihat kode karakter HTML yang menjijikkan itu, memperjelas bahwa Anda memiliki tanda kutip luar yang sebenarnya, dan tanda kutip dalam yang dikodekan HTML.
Jadi masalah dengan mencoba melakukan kutipan sendiri adalah Razor lolos dari ini.
Jika Anda ingin kontrol penuh atas kutipan
Gunakan Html.Raw untuk mencegah pelolosan kutipan:
Ditampilkan sebagai:
Di atas sangat aman karena saya tidak mengeluarkan HTML apa pun dari variabel. Satu-satunya variabel yang terlibat adalah kondisi terner. Namun, dan sekarang setiap pengguna lain yang melihat halaman ini memiliki kata sandinya langsung berubah menjadi kata sandi yang diketahui oleh pengguna jahat. berhati - hatilah karena teknik terakhir ini dapat membuat Anda terkena masalah keamanan tertentu jika membuat string dari data yang disediakan pengguna. Misalnya, jika Anda membuat atribut dari bidang data yang berasal dari data yang disediakan pengguna, gunakan Html. Raw berarti string dapat berisi akhir yang prematur dari atribut dan tag, kemudian mulai tag skrip yang melakukan sesuatu atas nama yang saat ini masuk pengguna (mungkin berbeda dari pengguna yang masuk). Mungkin Anda memiliki halaman dengan daftar semua gambar pengguna dan Anda menyetel keterangan alat menjadi nama pengguna setiap orang, dan satu pengguna menamai dirinya sendiri
'/><script>$.post('changepassword.php?password=123')</script>
sumber
Saya kira cara yang sedikit lebih nyaman dan terstruktur adalah dengan menggunakan helper Html. Dalam pandangan Anda, ini bisa terlihat seperti:
Jika cara ini berguna untuk Anda, saya sarankan untuk mendefinisikan kamus
htmlAttr
dalam model Anda sehingga tampilan Anda tidak memerlukan@{ }
blok logika (lebih jelas).sumber