¿Cómo utilizar el operador ternario en razor (específicamente en atributos HTML)?
Con el motor de visualización de WebForms, normalmente uso el operador ternario para condicionales muy simples, especialmente dentro de atributos HTML. Por ejemplo:
<a class="<%=User.Identity.IsAuthenticated ? "auth" : "anon" %>">My link here</a>
El código anterior le dará a la <a>
etiqueta una clase de auth
o anon
dependiendo de si el usuario está autenticado.
¿Cuál es la sintaxis equivalente con el motor de visualización Razor? Debido a que Razor requiere etiquetas HTML para "saber" cuándo entrar y salir del código y el marcado, actualmente estoy atascado con lo siguiente:
@if(User.Identity.IsAuthenticated) { <a class="auth">My link here</a> }
else { <a class="anon">My link here</a> }
Esto es, por decirlo suavemente, terrible .
Me encantaría hacer algo como esto, pero me cuesta entender cómo hacerlo en Razor:
<a class="@=User.Identity.IsAuthenticated ? "auth" : "anon";">My link here</a>
--
Actualizar:
Mientras tanto, he creado este HtmlHelper:
public static MvcHtmlString Conditional(this HtmlHelper html, Boolean condition, String ifTrue, String ifFalse)
{
return MvcHtmlString.Create(condition ? ifTrue : ifFalse);
}
que se puede llamar así desde Razor:
<a class="@Html.Conditional(User.Identity.IsAuthenticated, "auth", "anon")">My link here</a>
Aun así, espero que haya una manera de utilizar el operador ternario sin tener que recurrir a envolverlo en un método de extensión.
Debería poder utilizar la @()
sintaxis de expresión:
<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
Apéndice:
El concepto importante es que estás evaluando una expresión en tu código Razor. La mejor manera de hacer esto (si, por ejemplo, estás en un bucle foreach) es utilizar un método genérico.
La sintaxis para llamar a un método genérico en Razor es:
@(expression)
En este caso la expresión es:
User.Identity.IsAuthenticated ? "auth" : "anon"
Por tanto, la solución es:
@(User.Identity.IsAuthenticated ? "auth" : "anon")
Este código se puede usar en cualquier lugar de Razor, no solo para un atributo html.
Consulte el comentario de @Kyralessa para la referencia rápida de sintaxis de C# Razor (blog de Phil Haack).
¡Una versión más simple, para ojos fáciles!
@(true?"yes":"no")
Para aquellos de ustedes que usan ASP.net con VB razor, el operador ternario también es posible.
Debe estar, además, dentro de una expresión cortante:
@(Razor_Expression)
y el operador ternario funciona de la siguiente manera:
If(BooleanTestExpression, "TruePart", "FalsePart")
El mismo ejemplo de código que se muestra aquí con VB razor se ve así:
<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>
Nota: al escribir una expresión de texto, recuerde que los símbolos booleanos no son los mismos entre C# y VB.