Wie benutzt man ? : if-Anweisungen mit Razor- und Inline-Codeblöcken

154

Ich aktualisiere meine alten ASPX-Ansichten mit der neuen Razore-Ansichts-Engine. Ich habe eine Reihe von Stellen, an denen ich Code wie diesen habe:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>

Idealerweise möchte ich dies tun:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>

Hier gibt es jedoch zwei Probleme:

  1. vote-up@{puzzle.UserVote .... behandelt das @ -Symbol nicht als Start eines Codeblocks
  2. @puzzle.UserVote == VoteType.Upsieht den ersten Teil @puzzle.UserVoteso an, als ob er den Wert der Variablen rendern soll.

Weiß jemand, wie man diese Probleme angeht?

Micah
quelle
6
Ich habe Razor nicht benutzt, aber basierend auf dem, was ich sehe, versuche es@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt
Da dies das beste Ergebnis für ternäre Inline-Operatoren in Rasiermesser ist, füge ich hinzu, dass wenn Ihre Ausgabe HTML oder codierbare Zeichen wie Apostrophe enthält, z. @(isSomething ? "class='test'" : "")B. das Einfügen von Javascript oder ähnlichem, diese als Entitäten wie &#39;und die Seite brechen. Also musst du verwenden Html.Raw(".."). Andernfalls würden Sie mit dem obigen Code etwas <p class=&#39;test&#39;>Ungültiges erhalten.
NibblyPig

Antworten:

298

Das sollte funktionieren:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
CD..
quelle
2
Es ist sehr seltsam, den Paren anstelle der Zahnspange zu verwenden
pat capozzi
32

Der Schlüssel besteht darin, den Ausdruck in Klammern nach dem @ -Trennzeichen zu kapseln. Sie können jeden zusammengesetzten Ausdruck auf diese Weise arbeiten lassen.

JPC
quelle
28
@( condition ? "true" : "false" )
Daniel Santos
quelle
1
Ich habe mich für diesen entschieden, fühle mich sauber und kann später leicht zurückgelesen werden
Dan Harris
1
Wenn Sie den Wert einer Eigenschaft (einschließlich einer Zeichenfolge) anzeigen müssen, anstatt ToString () aufzurufen - was in meinem Fall nicht funktioniert hat. Sie können dies tun @ (Bedingung? $ "{Foo.bar}": "Standard")
Dan Harris
6

In den meisten Fällen funktioniert die Lösung von CD .. einwandfrei. Ich hatte jedoch eine etwas verdrehte Situation:

 @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)

Dies würde mich "& nbsp;" auf meiner Seite jeweils die Quelle generieren &amp;nbsp;. Jetzt gibt es eine Funktion, mit Html.Raw("&nbsp;")der Sie Quellcode schreiben können, außer in dieser Konstellation wird ein Compilerfehler ausgegeben:

Compiler-Fehlermeldung: CS0173: Der Typ des bedingten Ausdrucks kann nicht ermittelt werden, da keine implizite Konvertierung zwischen 'System.Web.IHtmlString' und 'string' erfolgt.

Also schrieb ich eine Aussage wie die folgende, die weniger schön ist, aber auch in meinem Fall funktioniert:

@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 

Hinweis: Interessant ist, dass Sie einen Razor-Block neu starten müssen, sobald Sie sich in der geschweiften Klammer befinden.

Damian Vogel
quelle
Warum nicht einfach@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons
Ähm ... wie wäre es mit dem oben genannten Compiler-Fehler? ;)
Damian Vogel
3
Entschuldigung, ich brauche mehr Kaffee :)
JP Hellemons
1
Sie können diesen Fehler vermeiden, indem Sie beide Seiten des ternären Operators auf den gleichen Typ festlegen. @(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig