web-dev-qa-db-fra.com

Comment utiliser l'opérateur ternaire dans rasoir (en particulier sur les attributs HTML)?

Avec le moteur de vue WebForms, j'utilise couramment 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 balise <a> une classe de auth ou anon, selon que l'utilisateur est authentifié ou non.

Quelle est la syntaxe équivalente avec le moteur de vue Razor? Parce que Razor a besoin des balises HTML pour "savoir" 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> }

Ceci est, pour le dire gentiment, 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 s'appeler comme ceci de Razor:

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

J'espère tout de même qu'il existe un moyen d'utiliser l'opérateur ternaire sans pour autant le replacer dans une méthode d'extension.

379
Portman

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, cependant, alors je peux me tromper.

722
David Brown

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) consiste à 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é n’importe où dans Razor, pas seulement pour un attribut HTML.

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

52
awrigley

Une version plus simple, pour des yeux faciles!

@(true?"yes":"no")
20
Monsters X

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

Ce doit être aussi 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 que celui 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 expression textuelle, rappelez-vous que les symboles booléens ne sont pas les mêmes entre C # et VB.

17
George_DLJ

dans mon problème, je veux que le texte d'ancre <a>text</a> à l'intérieur de ma vue soit basé sur une valeur et que le texte soit récupéré sous la forme App string Resources

oui, 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 utilisez ceci

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

Vous pouvez également utiliser cette méthode:

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

Essayez ceci .. Bonne chance Merci.

0
Arjun