Come usare ? : se istruzioni con Razor e blocchi di codice inline


154

Sto aggiornando le mie vecchie visualizzazioni .aspx con il nuovo motore di visualizzazione Razore. Ho un sacco di posti in cui ho un codice come questo:

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

Idealmente mi piacerebbe fare questo:

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

Tuttavia, ci sono due problemi qui:

  1. vote-up@{puzzle.UserVote .... non sta trattando il simbolo @ come l'inizio di un blocco di codice
  2. @puzzle.UserVote == VoteType.Upguarda la prima parte @puzzle.UserVotecome se si supponga che renda il valore della variabile.

Qualcuno sa come affrontare questi problemi?


6
Non ho usato Razor ma basandomi su quello che sto vedendo, prova@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt il

Poiché questo è il risultato migliore per gli operatori ternari in linea nel rasoio, aggiungerò che se l'output contiene caratteri html o codificabili come apostrofi, ad @(isSomething ? "class='test'" : "")esempio iniettando javascript o simili, li codificherà come entità come &#39;e spezzerà la pagina. Quindi devi usare Html.Raw(".."). Altrimenti con il codice sopra si finirebbe con qualcosa del genere <p class=&#39;test&#39;>non valido.
NibblyPig

Risposte:


298

Questo dovrebbe funzionare:

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

2
molto strano usare il paren piuttosto che il tutore
pat capozzi

32

La chiave è incapsulare l'espressione tra parentesi dopo il delimitatore @. Puoi far funzionare qualsiasi espressione composta in questo modo.


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

1
Ho optato per questo, mi sento pulito ed è facile da leggere più tardi
Dan Harris

1
Se devi visualizzare il valore di una proprietà (inclusa una stringa) anziché chiamare ToString () - Che non ha funzionato nel mio caso. Puoi farlo @ (condizione? $ "{Foo.bar}": "Predefinito")
Dan Harris

6

Nella maggior parte dei casi la soluzione di CD .. funzionerà perfettamente. Tuttavia ho avuto una situazione un po 'più contorta:

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

Questo mi stampa "& nbsp;" nella mia pagina, rispettivamente generare la fonte &amp;nbsp;. Ora c'è una funzione Html.Raw("&nbsp;")che dovrebbe permetterti di scrivere il codice sorgente, tranne che in questa costellazione genera un errore del compilatore:

Messaggio di errore del compilatore: CS0173: Impossibile determinare il tipo di espressione condizionale perché non esiste una conversione implicita tra 'System.Web.IHtmlString' e 'string'

Così ho finito per scrivere una dichiarazione come la seguente, che è meno carina ma funziona anche nel mio caso:

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

Nota: la cosa interessante è che, una volta dentro la parentesi graffa, è necessario riavviare un blocco Razor.


Perché non solo@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons il

Uhm ... che ne dici a causa del già citato errore del compilatore? ;)
Damian Vogel,

3
Mi dispiace, ho bisogno di più caffè :)
JP Hellemons,

1
È possibile evitare tale errore rendendo entrambi gli operatori ternari dello stesso tipo,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.