Cómo utilizar ? : sentencias if con Razor y bloques de código en línea

154

Estoy actualizando mis viejas vistas .aspx con el nuevo motor de vista Razore. Tengo un montón de lugares donde tengo un código como este:

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

Idealmente me gustaría hacer esto:

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

Sin embargo, hay dos problemas aquí:

  1. vote-up@{puzzle.UserVote .... no trata el símbolo @ como el inicio de un bloque de código
  2. @puzzle.UserVote == VoteType.Upmira la primera parte @puzzle.UserVotecomo si se supusiera que representa el valor de la variable.

¿Alguien sabe cómo abordar estos problemas?

Micah
fuente
66
No he usado Razor, pero según lo que estoy viendo, inténtalo@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt
Como este es el mejor resultado para operadores ternarios en línea en razor, agregaré que si su salida contiene html o caracteres codificables como apóstrofes, por @(isSomething ? "class='test'" : "")ejemplo, inyectando javascript o similar, los codificará como entidades &#39;y romperá la página. Entonces debes usar Html.Raw(".."). De lo contrario, con el código anterior, terminaría con algo como lo <p class=&#39;test&#39;>que no es válido.
NibblyPig

Respuestas:

298

Esto debería funcionar:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
DISCOS COMPACTOS..
fuente
2
es muy extraño usar el paré en lugar del corsé
pat capozzi
32

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

JPC
fuente
28
@( condition ? "true" : "false" )
Daniel Santos
fuente
1
Fui por este, se siente limpio y es fácil de leer más tarde
Dan Harris
1
Si necesita mostrar el valor de una propiedad (incluida una cadena) en lugar de llamar a ToString (), que no funcionó en mi caso. Puede hacer esto @ (condición? $ "{Foo.bar}": "Predeterminado")
Dan Harris
6

En la mayoría de los casos, la solución de CD ... funcionará perfectamente bien. Sin embargo, tuve una situación un poco más retorcida:

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

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

Mensaje de error del compilador: CS0173: El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'System.Web.IHtmlString' y 'string'

Así que terminé escribiendo una declaración como la siguiente, que es menos agradable pero funciona incluso en mi caso:

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

Nota: lo interesante es que, una vez que esté dentro de la llave, debe reiniciar un bloque Razor.

Damian Vogel
fuente
¿Por qué no simplemente?@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons
Uhm ... ¿qué tal debido al error del compilador mencionado anteriormente? ;)
Damian Vogel el
3
Lo siento, necesito más café :)
JP Hellemons
1
Puede evitar ese error haciendo que ambos lados del operador ternario sean del mismo tipo,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig