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?


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>

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.


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

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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.