Wie verwende ich einen ternären Operator in Rasiermesser (speziell für HTML-Attribute)?


401

Mit der WebForms-Ansichts-Engine verwende ich häufig den ternären Operator für sehr einfache Bedingungen, insbesondere innerhalb von HTML-Attributen. Zum Beispiel:

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

Der obige Code gibt dem <a>Tag eine Klasse von authoder anonabhängig davon, ob der Benutzer authentifiziert ist.

Was ist die äquivalente Syntax mit der Razor View Engine? Da für Razor HTML-Tags erforderlich sind, um zu "wissen", wann Code und Markup ein- und ausgeblendet werden müssen, habe ich derzeit folgende Probleme:

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

Das ist, gelinde gesagt, schrecklich .

Ich würde gerne etwas tun wie dieses, aber ich kämpfen wie in Razor zu verstehen:

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

- -

Aktualisieren:

In der Zwischenzeit habe ich diesen HtmlHelper erstellt:

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

was von Razor so genannt werden kann:

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

Trotzdem hoffe ich, dass es eine Möglichkeit gibt, den ternären Operator zu verwenden, ohne auf eine Erweiterungsmethode zurückzugreifen.


Nur als eine Frage von "Best Practice" glaube ich, dass Sie Typ IHtmlStringmit der Methode new HtmlString("Some stuff here");für Helfer usw. zurückgeben sollten ...
Justin Soliz


Bitte stimmen Sie hier ab .
Shimmy Weitzhandler

Antworten:


767

Sie sollten in der Lage sein, die @()Ausdruckssyntax zu verwenden :

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

Ich habe Razor jedoch nicht installiert, daher könnte ich mich irren.


60
Hier ist eine praktische Referenz zur Rasiermessersyntax: C # Rasiermessersyntax - Kurzreferenz
Ryan Lundy

<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Mein Link hier </a>
BiLaL

Kann ich dieser Logik den Operator && hinzufügen?
Alerya

58

Nachtrag:

Das wichtige Konzept ist, dass Sie einen Ausdruck in Ihrem Razor-Code auswerten. Der beste Weg, dies zu tun (wenn Sie sich beispielsweise in einer foreach-Schleife befinden), ist die Verwendung einer generischen Methode.

Die Syntax zum Aufrufen einer generischen Methode in Razor lautet:

@(expression)

In diesem Fall lautet der Ausdruck:

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

Daher lautet die Lösung:

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

Dieser Code kann überall in Razor verwendet werden, nicht nur für ein HTML-Attribut.

Siehe @Kyralessas Kommentar für die C # Razor Syntax-Kurzreferenz (Phil Haacks Blog).


Ich habe gerade Ihren Nachtrag bemerkt, nachdem ich der Hauptantwort ähnliche Kommentare hinzugefügt habe.
BiLaL

22

Eine einfachere Version für einfache Augen!

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

11
das ist nicht einfacher. Das ist die gleiche Antwort mit unterschiedlichen Werten
Dave Rael

4
-1 Dave Rael hat recht, dies ist der gleiche Code mit unterschiedlichen Werten
Jacques

6
Dies erklärt tatsächlich den ternären Operator. Es ist also eine gute Sucht nach der Lösung, die nicht sagt, wo das Wahre und Falsche in der Bedingung ist.
Maurizio In Dänemark

3
Ich dachte auch. Als Entwickler dürfen wir manchmal klare Antworten haben.
Monster X

17

Für diejenigen unter Ihnen, die ASP.net mit VB-Rasierer verwenden, ist auch der ternäre Operator möglich.

Es muss sich auch in einem Rasiermesserausdruck befinden:

@(Razor_Expression)

und der ternäre Operator arbeitet wie folgt:

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

Das gleiche Codebeispiel, das hier mit VB-Rasierer gezeigt wird, sieht folgendermaßen aus:

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

Hinweis: Denken Sie beim Schreiben eines TextExpression daran, dass die Booleschen Symbole zwischen C # und VB nicht identisch sind.


1

In meinem Problem möchte ich, dass der Ankertext <a>text</a>in meiner Ansicht auf einem bestimmten Wert basiert und dieser Text aus der Form abgerufen wirdApp string Resources

Das @()ist also die Lösung

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

Wenn der Text nicht von App string Resourcesverwendet wird, verwenden Sie dies

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

0

Sie können auch diese Methode verwenden:

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

Versuchen Sie dies .. Viel Glück Danke.


Muss @ mit mvc-Bedingung hinzugefügt werden? Ich glaube nicht, weil @ bereits zu Beginn verwendet wurde.
Mubashar Shahzad

Keine Notwendigkeit, @ unter dem @ () zu verwenden
Aikansh Mann
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.