asp.net - band - Cómo utilizar ?:if declaraciones con Razor y bloques de código en línea
razor if (4)
Estoy actualizando mis viejas vistas .aspx con el nuevo motor de vistas de 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í:
-
vote-up@{puzzle.UserVote
.... no trata el símbolo @ como inicio de un bloque de código -
@puzzle.UserVote == VoteType.Up
mira la primera parte@puzzle.UserVote
como si se supone que representa el valor de la variable.
¿Alguien sabe cómo abordar estos problemas?
En la mayoría de los casos, la solución de funcionará perfectamente bien. Sin embargo, tuve una situación un poco más retorcida:
@(String.IsNullOrEmpty(Model.MaidenName) ? " " : Model.MaidenName)
Esto me imprimiría "& nbsp;" en mi página, respectivamente, generan la fuente &nbsp;
. Ahora hay una función Html.Raw(" ")
que se supone que te permite escribir código fuente, excepto en esta constelación arroja un error de compilación:
Mensaje de error del compilador: CS0173: El tipo de expresión condicional no puede determinarse 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(" ") } else { @Model.MaidenName }
Nota: lo interesante es que, una vez que está dentro del corsé, debe reiniciar un bloque Razor.
Esto debería funcionar:
<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
La clave es encapsular la expresión entre paréntesis después del delimitador @. Puedes hacer que cualquier expresión compuesta funcione de esta manera.
@( condition ? "true" : "false" )