2011-01-22 7 views
123

Sto aggiornando le mie vecchie viste .aspx con il nuovo motore di visualizzazione Razore. Ho un sacco di posti in cui ho il codice come questo:Come si usa? : se le istruzioni con Razor e blocchi di codice inline

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

Idealmente mi piacerebbe fare questo:

<span class="[email protected]{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span> 

Tuttavia ci sono due problemi qui:

  1. [email protected]{puzzle.UserVote. ... non è trattare il simbolo @ come un inizio di un blocco di codice
  2. @puzzle.UserVote == VoteType.Up guarda alla prima parte @puzzle.UserVote come se fosse supposto per rendere il valore della variabile.

Qualcuno sa come affrontare questi problemi?

+6

Non ho usato il rasoio ma in base a ciò che sto vedendo, prova '@ (puzzle.UserVote == VoteType.Up?" -selected ":" ")' –

risposta

239

questo dovrebbe funzionare:

<span class="[email protected](puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span> 
+0

molto strano usare il paren piuttosto che il coppia –

29

La chiave è quello di incapsulare l'espressione tra parentesi dopo il @ delimitatore. Puoi fare in modo che qualsiasi espressione composta funzioni in questo modo.

8
@(condition ? "true" : "false") 
+1

Sono andato per questo, si sente pulito ed è facile da leggere più tardi –

+1

Se è necessario 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") –

1

Nella maggior parte dei casi the solution di CD.. funzionerà perfettamente bene. Tuttavia ho avuto un po 'la situazione più contorto:

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

Questo mi avrebbe stampare "& nbsp;" nella mia pagina, generare rispettivamente la fonte &amp;nbsp;. Ora c'è una funzione Html.Raw("&nbsp;") che dovrebbe lasciare che si scrive il codice sorgente, se non in questa costellazione getta un errore di compilazione:

Compiler Error Message: CS0173: Type of conditional expression cannot be determined because there is no implicit conversion between 'System.Web.IHtmlString' and 'string'

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

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

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

Problemi correlati