Jak używać ? : if instrukcje z Razor i blokami kodu wbudowanego

154

Aktualizuję moje stare widoki .aspx za pomocą nowego silnika widoku Razore. Mam kilka miejsc, w których mam taki kod:

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

Idealnie chciałbym to zrobić:

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

Jednak są tutaj dwa problemy:

  1. vote-up@{puzzle.UserVote .... nie traktuje symbolu @ jako początku bloku kodu
  2. @puzzle.UserVote == VoteType.Uppatrzy na pierwszą część @puzzle.UserVotetak, jakby miała renderować wartość zmiennej.

Czy ktoś wie, jak rozwiązać te problemy?

Micheasza
źródło
6
Nie używałem Razora, ale w oparciu o to, co widzę, spróbuj@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt
Ponieważ jest to najwyższy wynik dla operatorów trójskładnikowych wbudowanych w maszynce do golenia, dodam, że jeśli dane wyjściowe zawierają znaki html lub zakodowane znaki, takie jak apostrofy, np. @(isSomething ? "class='test'" : "")Na przykład wstrzyknięcie javascript lub podobne, zakoduje je jako jednostki takie jak &#39;i przerywa stronę. Więc musisz użyć Html.Raw(".."). W przeciwnym razie z powyższym kodem otrzymasz coś takiego, <p class=&#39;test&#39;>co jest nieprawidłowe.
NibblyPig

Odpowiedzi:

298

To powinno działać:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
PŁYTA CD..
źródło
2
bardzo dziwne jest używanie paren zamiast
szyny
32

Kluczem jest hermetyzacja wyrażenia w nawiasach za ogranicznikiem @. W ten sposób możesz sprawić, by każde wyrażenie złożone działało.

JPC
źródło
28
@( condition ? "true" : "false" )
Daniel Santos
źródło
1
Poszedłem na ten, czuję się czysty i łatwo go później przeczytać
Dan Harris
1
Jeśli chcesz wyświetlić wartość właściwości (w tym ciąg znaków) zamiast wywoływać ToString () - co nie zadziałało w moim przypadku. Możesz to zrobić @ (condition? $ "{Foo.bar}": "Default")
Dan Harris,
6

W większości przypadków rozwiązanie z CD .. zadziała perfekcyjnie. Miałem jednak nieco bardziej pokręconą sytuację:

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

Spowoduje to wydrukowanie mi „& nbsp;” na mojej stronie, odpowiednio wygeneruj źródło &amp;nbsp;. Teraz jest funkcja, Html.Raw("&nbsp;")która ma pozwolić ci pisać kod źródłowy, z tą różnicą, że w tej konstelacji generuje błąd kompilatora:

Komunikat o błędzie kompilatora: CS0173: Nie można określić typu wyrażenia warunkowego, ponieważ nie ma niejawnej konwersji między „System.Web.IHtmlString” a „stringiem”

Skończyło się więc na napisaniu oświadczenia podobnego do następującego, które jest mniej przyjemne, ale działa nawet w moim przypadku:

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

Uwaga: interesującą rzeczą jest to, że gdy znajdziesz się w nawiasie klamrowym, musisz ponownie uruchomić blok Razor.

Damian Vogel
źródło
Dlaczego nie tylko@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons
Uhm… co powiesz na wspomniany błąd kompilatora? ;)
Damian Vogel
3
Przepraszam, potrzebuję więcej kawy :)
JP Hellemons
1
Możesz uniknąć tego błędu, ustawiając obie strony operatora trójskładnikowego tego samego typu,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig