476 votes

Comment utiliser l'opérateur ternaire dans razor (spécifiquement sur les attributs HTML) ?

Avec le moteur de visualisation WebForms, j'utiliserai couramment l'opérateur ternaire pour des conditions très simples, notamment dans les attributs HTML. Par exemple :

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

Le code ci-dessus donnera le <a> étiqueter une classe de auth o anon selon que l'utilisateur est authentifié ou non.

Quelle est la syntaxe équivalente avec le moteur de vue Razor ? Comme Razor exige que les balises HTML "sachent" quand entrer et sortir du code et du balisage, je suis actuellement coincé avec ce qui suit :

@if(User.Identity.IsAuthenticated)  { <a class="auth">My link here</a> }
else { <a class="anon">My link here</a> }

C'est le moins qu'on puisse dire, terrible .

J'aimerais faire quelque chose comme mais j'ai du mal à comprendre comment dans Razor :

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

--

Mise à jour :

En attendant, j'ai créé ce HtmlHelper :

public static MvcHtmlString Conditional(this HtmlHelper html, Boolean condition, String ifTrue, String ifFalse)
{
  return MvcHtmlString.Create(condition ? ifTrue : ifFalse);
}

qui peut être appelé comme ceci à partir de Razor :

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

J'espère néanmoins qu'il existe un moyen d'utiliser l'opérateur ternaire sans avoir à l'intégrer dans une méthode d'extension.

0 votes

Juste pour une question de "meilleure pratique", je pense que vous devriez renvoyer le type IHtmlString avec la méthode new HtmlString("Some stuff here"); pour les aides etc...

0 votes

0 votes

Veuillez voter aquí .

906voto

David Brown Points 14365

Vous devriez être en mesure d'utiliser le @() syntaxe de l'expression :

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

64 votes

Voici une référence pratique à la syntaxe Razor : Référence rapide à la syntaxe du rasoir C#

0 votes

<a class=@(User.Identity.IsAuthenticated ? "auth" : "anon")>Mon lien ici</a>

0 votes

Puis-je ajouter l'opérateur && dans cette logique ?

73voto

awrigley Points 6468

Addendum :

Le concept important est que vous évaluez une expression dans votre code Razor. La meilleure façon de le faire (si, par exemple, vous êtes dans une boucle foreach) est d'utiliser une méthode générique.

La syntaxe pour appeler une méthode générique dans Razor est la suivante :

@(expression)

Dans ce cas, l'expression est :

User.Identity.IsAuthenticated ? "auth" : "anon"

Par conséquent, la solution est :

@(User.Identity.IsAuthenticated ? "auth" : "anon")

Ce code peut être utilisé partout dans Razor, pas seulement pour un attribut html.

Voir le commentaire de @Kyralessa sur C# Razor Syntax Quick Reference (blog de Phil Haack).

0 votes

Je viens de remarquer votre addendum après avoir ajouté les commentaires similaires à la réponse principale.

1 votes

En quoi une expression est-elle une méthode générique ?

31voto

Monsters X Points 1016

Une version plus simple, pour des yeux faciles !

@(true?"yes":"no")

14 votes

Ce n'est pas plus simple. c'est la même réponse avec des valeurs différentes

4 votes

-1 Dave Rael a raison, c'est le même code avec des valeurs différentes

9 votes

Cela explique en fait l'opérateur ternaire. C'est donc un bon complément à la solution qui ne dit pas où se trouvent le vrai et le faux dans la condition.

19voto

George_DLJ Points 71

Pour ceux d'entre vous qui utilisent ASP.net avec VB razor, l'opérateur ternaire est également possible.

Il doit être, lui aussi, à l'intérieur d'une expression de rasoir :

@(Razor_Expression)

et l'opérateur ternaire fonctionne comme suit :

If(BooleanTestExpression, "TruePart", "FalsePart")

Le même exemple de code montré ici avec VB razor ressemble à ceci :

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

Remarque : lorsque vous écrivez une expression textuelle, n'oubliez pas que les symboles booléens ne sont pas les mêmes en C# et en VB.

6voto

Basheer AL-MOMANI Points 5565

Dans mon problème je veux que le texte de l'ancre <a>text</a> à mon avis, être basé sur une certaine valeur et ce texte est récupéré à partir de App string Resources

donc, ceci @() est la solution

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

si le texte ne provient pas de App string Resources utiliser ce

@(Model.ID == 0 ? "Back" :"Descart Changes")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X