¿Cómo usar el operador ternario en la maquinilla de afeitar (específicamente en los atributos HTML)?

402

Con el motor de vista de WebForms, comúnmente usaré el operador ternario para condicionales muy simples, especialmente dentro de los 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 vista Razor? Debido a que Razor requiere que las etiquetas HTML "sepan" 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 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>

Aún así, espero que haya una manera de usar el operador ternario sin recurrir a un método de extensión.

Portman
fuente
Así como una cuestión de "Mejor Práctica" Creo que debe devolver el tipo IHtmlStringcon el método new HtmlString("Some stuff here");de ayudantes, etc ...
Justin Soliz
Haces como stackoverflow.com/questions/6981853/…
Elan Hasson el
Por favor vote aquí .
Shimmy Weitzhandler

Respuestas:

768

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

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>

Sin embargo, no tengo Razor instalado, así que podría estar equivocado.

David Brown
fuente
6060
Aquí hay una referencia útil para la sintaxis de Razor: Referencia rápida de sintaxis de Razor de C #
Ryan Lundy
<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Mi enlace aquí </a>
BiLaL
¿Puedo agregar el operador && a esta lógica?
alerya
58

Apéndice:

El concepto importante es que está evaluando una expresión en su código Razor. La mejor manera de hacer esto (si, por ejemplo, está en un bucle foreach) es usar 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 lo 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.

Vea el comentario de @Kyralessa para C # Razor Syntax Quick Reference (blog de Phil Haack).

Awrigley
fuente
Acabo de notar su apéndice después de agregar los comentarios similares a la respuesta principal.
BiLaL
22

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

@(true?"yes":"no")
Monstruos X
fuente
11
Eso no es más simple. esa es la misma respuesta con diferentes valores
Dave Rael
44
-1 Dave Rael tiene razón, este es el mismo código con valores diferentes
Jacques
66
Esto realmente explica el operador ternario. Entonces, es una buena adicción a la solución que no dice dónde está lo verdadero y lo falso en la condición.
Maurizio En Dinamarca
3
Ya me lo imaginaba. como desarrolladores se nos permite tener respuestas claras ... a veces.
Monsters X
17

Para aquellos de ustedes que usan ASP.net con la maquinilla de afeitar VB, el operador ternario también es posible.

También debe estar dentro de una expresión de afeitar:

@(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 la maquinilla de afeitar VB se ve así:

<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>

Nota: al escribir una TextExpression recuerde que los símbolos booleanos no son lo mismo entre C # y VB.

George_DLJ
fuente
1

en mi problema, quiero que el texto de anclaje <a>text</a>dentro de mi vista se base en algún valor y ese texto se recupere de formaApp string Resources

entonces esta @()es la solución

<a href='#'>
      @(Model.ID == 0 ? Resource_en.Back : Resource_en.Department_View_DescartChanges)
</a>

si el texto no es de App string Resourcesusar esto

@(Model.ID == 0 ? "Back" :"Descart Changes")
Basheer AL-MOMANI
fuente
0

También puedes usar este método:

<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">

Prueba esto .. Buena suerte Gracias.

Arjun
fuente
¿hay alguna necesidad de agregar @ con condición de mvc? No lo creo, porque @ ya se ha utilizado al principio.
Mubashar Shahzad
no es necesario usar @ bajo el @ ()
Aikansh Mann