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?


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>

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.


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.