Nasıl kullanılır ? : jilet ve satır içi kod blokları ile if ifadeleri


154

Eski .aspx görünümlerimi yeni Razore görünüm motoruyla güncelliyoruz. Ben böyle bir kod var yerlerde bir sürü var:

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

İdeal olarak bunu yapmak istiyorum:

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

Ancak burada iki sorun var:

  1. vote-up@{puzzle.UserVote .... @ sembolüne kod bloğunun başlangıcı olarak davranmıyor
  2. @puzzle.UserVote == VoteType.Upilk kısma @puzzle.UserVote, değişkenin değerini oluşturması gerekiyormuş gibi bakar .

Bu sorunları nasıl çözeceğini bilen var mı?


6
Razor kullanmadım ama gördüklerime dayanarak, deneyin@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt

Bu, usturadaki satır içi üçlü operatörler için en iyi sonuç olduğundan, çıktınız html veya kesme işaretleri gibi kodlanabilir karakterler içeriyorsa, örneğin @(isSomething ? "class='test'" : ""), örneğin javascript veya benzeri enjekte etmek, bunları &#39;sayfa gibi kodlayacak ve sayfayı kıracağını ekleyeceğim . Yani kullanmalısınız Html.Raw(".."). Aksi takdirde yukarıdaki kod ile <p class=&#39;test&#39;>geçersiz gibi bir şey elde edersiniz .
NibblyPig

Yanıtlar:


298

Bu çalışmalı:

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

2
paren

32

Anahtar, @ sınırlayıcıdan sonra ifadeyi parantez içine almaktır. Herhangi bir bileşik ifadeyi bu şekilde çalıştırabilirsiniz.


28
@( condition ? "true" : "false" )

1
Bunun için gittim, temiz hissediyor ve daha sonra kolayca okunabiliyor
Dan Harris

1
ToString () çağırmak yerine bir özelliğin (dize dahil) değerini görüntülemeniz gerekiyorsa - Bu benim durumumda işe yaramadı. Bunu @ (koşul? $ "{Foo.bar}": "Varsayılan") yapabilirsiniz
Dan Harris

6

Çoğu durumda çözüm ait CD .. ince mükemmel çalışacaktır. Ancak biraz daha bükülmüş durumum vardı:

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

Bu beni "& nbsp;" yazdıracaktı sayfamda sırasıyla kaynağı oluşturur &amp;nbsp;. Şimdi Html.Raw("&nbsp;")kaynak kod yazmanıza izin verilen bir işlev var , ancak bu takımyıldızın dışında bir derleyici hatası atıyor:

Derleyici Hata İletisi: CS0173: 'System.Web.IHtmlString' ve 'string' arasında dolaylı dönüşüm olmadığından koşullu ifade türü belirlenemiyor

Bu yüzden, daha az hoş ama benim durumumda bile çalışan aşağıdaki gibi bir ifade yazdım:

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

Not: ilginç olan şey, kıvırcık parantez içine girdikten sonra, bir Razor bloğunu yeniden başlatmanız gerekir.


Neden sadece@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons

Uhm .. daha önce bahsedilen Derleyici Hatası nedeniyle nasıl? ;)
Damian Vogel

3
Üzgünüm, daha fazla kahveye ihtiyacım var :)
JP Hellemons

1
Üçlü operatörün her iki tarafını da aynı tür yaparak bu hatayı önleyebilirsiniz@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.