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


402

Avec le moteur de vue WebForms, je vais généralement utiliser l'opérateur ternaire pour des conditions très simples, en particulier dans les attributs HTML. Par exemple:

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

Le code ci-dessus donnera à la <a>balise une classe authou anonselon que l'utilisateur est authentifié.

Quelle est la syntaxe équivalente avec le moteur de visualisation Razor? Parce que Razor nécessite des balises HTML pour "savoir" quand sauter dans et hors du code et du balisage, je suis actuellement bloqué 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, pour le moins, terrible .

J'aimerais faire quelque chose comme ça, 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é ainsi de Razor:

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

Pourtant, j'espère qu'il existe un moyen d'utiliser l'opérateur ternaire sans revenir à l'envelopper dans une méthode d'extension.


Juste comme une question de "meilleure pratique", je crois que vous devriez retourner le type IHtmlStringavec la méthode new HtmlString("Some stuff here");pour les aides, etc ...
Justin Soliz


Veuillez voter ici .
Shimmy Weitzhandler

Réponses:


768

Vous devriez pouvoir utiliser la @()syntaxe d'expression:

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

Je n'ai pas installé Razor, donc je peux me tromper.


60
Voici une référence pratique à la syntaxe Razor: C # Razor Syntax Quick Reference
Ryan Lundy

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

Puis-je ajouter && operator dans cette logique?
alerya

58

Addenda:

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:

@(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é n'importe où dans Razor, pas seulement pour un attribut html.

Voir le commentaire de @Kyralessa pour la référence rapide de la syntaxe C # Razor (blog de Phil Haack).


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

22

Une version plus simple, pour un regard facile!

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

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

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

6
Cela explique en fait l'opérateur ternaire. C'est donc une bonne dépendance à la solution qui ne dit pas où est le vrai et le faux dans la condition.
Maurizio Au Danemark

3
J'ai pensé ainsi. en tant que développeurs, nous sommes autorisés à avoir des réponses claires .. parfois.
Monsters X

17

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

Il doit également figurer dans 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 le rasoir VB ressemble à ceci:

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

Remarque: lors de l'écriture d'une TextExpression, n'oubliez pas que les symboles booléens ne sont pas les mêmes entre C # et VB.


1

dans mon problème, je veux que le texte de l'ancre <a>text</a>dans ma vue soit basé sur une certaine valeur et que le texte soit récupéré sous formeApp string Resources

c'est @()la solution

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

si le texte ne doit pas App string Resourcesutiliser ce

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

0

Vous pouvez également utiliser cette méthode:

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

Essayez ceci .. Bonne chance Merci.


est-il nécessaire d'ajouter @ avec condition mvc? Je ne pense pas, car @ a déjà été utilisé au départ.
Mubashar Shahzad

pas besoin d'utiliser @ sous le @ ()
Aikansh Mann
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.