¿Cómo utilizar el operador ternario en razor (específicamente en atributos HTML)?

Resuelto Portman asked hace 13 años • 7 respuestas

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 autho anondependiendo 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.

Portman avatar Nov 04 '10 04:11 Portman
Aceptado

Debería poder utilizar la @()sintaxis de expresión:

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
David Brown avatar Nov 03 '2010 22:11 David Brown

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).

awrigley avatar Nov 16 '2011 11:11 awrigley

¡Una versión más simple, para ojos fáciles!

@(true?"yes":"no")
Monsters X avatar Jan 22 '2012 15:01 Monsters X

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.

George_DLJ avatar Nov 07 '2012 14:11 George_DLJ