Cara Penggunaan ? : jika pernyataan dengan Razor dan blok kode inline

154

Saya memperbarui pandangan .aspx lama saya dengan mesin tampilan Razore baru. Saya memiliki banyak tempat di mana saya memiliki kode seperti ini:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>

Idealnya saya ingin melakukan ini:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>

Namun ada dua masalah di sini:

  1. vote-up@{puzzle.UserVote .... tidak memperlakukan simbol @ sebagai awal dari blok kode
  2. @puzzle.UserVote == VoteType.Upmelihat bagian pertama @puzzle.UserVoteseolah-olah seharusnya membuat nilai variabel.

Adakah yang tahu cara mengatasi masalah ini?

Mikha
sumber
6
Saya belum pernah menggunakan Razor tetapi berdasarkan apa yang saya lihat, coba@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt
Karena ini adalah hasil teratas untuk operator ternary inline dalam silet, saya akan menambahkan bahwa jika output Anda berisi html atau karakter yang dapat dikodekan seperti apostrof, misalnya @(isSomething ? "class='test'" : "")misalnya menyuntikkan javascript atau sejenisnya, itu akan menyandikan mereka sebagai entitas seperti &#39;dan menghancurkan halaman. Jadi, Anda harus menggunakan Html.Raw(".."). Kalau tidak, dengan kode di atas Anda akan berakhir dengan sesuatu seperti <p class=&#39;test&#39;>yang tidak valid.
NibblyPig

Jawaban:

298

Ini seharusnya bekerja:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
CD..
sumber
2
sangat aneh menggunakan paren daripada brace
pat capozzi
32

Kuncinya adalah untuk merangkum ekspresi dalam tanda kurung setelah pembatas @. Anda dapat membuat ekspresi majemuk apa pun bekerja dengan cara ini.

JPC
sumber
28
@( condition ? "true" : "false" )
Daniel Santos
sumber
1
Saya memilih yang ini, merasa bersih dan mudah dibaca kembali nanti
Dan Harris
1
Jika Anda perlu menampilkan nilai properti (termasuk string) daripada memanggil ToString () - Yang tidak berfungsi dalam kasus saya. Anda dapat melakukan ini @ (syarat? $ "{Foo.bar}": "Default")
Dan Harris
6

Dalam kebanyakan kasus solusi dari CD .. akan bekerja baik-baik saja. Namun saya memiliki situasi yang sedikit lebih bengkok:

 @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)

Ini akan mencetak saya "& nbsp;" di halaman saya, masing-masing menghasilkan sumber &amp;nbsp;. Sekarang ada fungsi Html.Raw("&nbsp;")yang seharusnya membuat Anda menulis kode sumber, kecuali dalam konstelasi ini ia membuat kesalahan kompilator:

Pesan Kesalahan Kompiler: CS0173: Jenis ekspresi kondisional tidak dapat ditentukan karena tidak ada konversi implisit antara 'System.Web.IHtmlString' dan 'string'

Jadi saya akhirnya menulis pernyataan seperti berikut, yang kurang bagus tetapi berfungsi bahkan dalam kasus saya:

@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 

Catatan: hal yang menarik adalah, begitu Anda berada di dalam kurung kurawal, Anda harus memulai ulang blok Razor.

Damian Vogel
sumber
Mengapa tidak adil@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons
Uhm .. bagaimana dengan karena Kesalahan Kompiler yang disebutkan di atas? ;)
Damian Vogel
3
Maaf, saya butuh kopi lagi :)
JP Hellemons
1
Anda dapat menghindari kesalahan itu dengan membuat kedua sisi operator ternary jenis yang sama,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig