2011-01-22 10 views
123

Estoy actualizando mis viejas vistas .aspx con el nuevo motor de vista de Razore. Tengo un montón de lugares donde tengo código como este:¿Cómo usar? : if declaraciones con Razor y bloques de código en línea

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

Idealmente me gustaría hacer esto:

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

Sin embargo hay dos problemas:

  1. [email protected]{puzzle.UserVote. ... no está tratando el símbolo @ como un inicio de un bloque de código
  2. @puzzle.UserVote == VoteType.Up mira la primera parte @puzzle.UserVote como si fuera se supone que debe representar el valor de la variable.

¿Alguien sabe cómo solucionar estos problemas?

+6

No he usado Razor, pero basado en lo que estoy viendo, intente '@ (puzzle.UserVote == VoteType.Up?" -selected ":" ")' –

Respuesta

239

esto debería funcionar:

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

muy extraño usar el paren en lugar del llave –

29

La clave es encapsular la expresión entre paréntesis después de la @ delimitador. Puedes hacer que cualquier expresión compuesta funcione de esta manera.

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

Fui por este, me siento limpio y es fácil de leer más tarde –

+1

Si necesita mostrar el valor de una propiedad (incluyendo una cadena) en lugar de llamar a ToString() - Lo cual no funcionó en mi caso. Puedes hacer esto @ (condición? $ "{Foo.bar}": "Predeterminado") –

1

En la mayoría de los casos the solution de CD.. funcionará perfectamente bien. Sin embargo, tenía un poco más retorcido situación:

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

Esto me imprimiría "& nbsp;" en mi página, respectivamente, generan la fuente &amp;nbsp;. Ahora hay una función Html.Raw("&nbsp;") que se supone que permitirá escribir código fuente, excepto en esta constelación que arroja un error de compilación:

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

así que terminé de escribir una declaración como la siguiente, que es menos agradable, pero las obras incluso en mi caso:

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

Nota: lo interesante es que una vez que están dentro de la llave de cierre, tiene que reiniciar un bloque de afeitar.

Cuestiones relacionadas