Ich versuche, etwas wie das Folgende zu tun
<div id="test">
@(
string.IsNullOrEmpty(myString)
? @:
: myString
)
</div>
Die obige Syntax ist ungültig, ich habe eine Reihe verschiedener Dinge ausprobiert, kann sie aber nicht zum Laufen bringen.
Versuche Folgendes:
@Html.Raw(string.IsNullOrEmpty(myString) ? " " : Html.Encode(myString))
Aber ich würde Ihnen empfehlen, einen Helfer zu schreiben, der diese Arbeit erledigt, damit Sie Ihre Ansichten nicht in Spaghetti verwandeln müssen:
public static class HtmlExtensions
{
public static IHtmlString ValueOrSpace(this HtmlHelper html, string value)
{
if (string.IsNullOrEmpty(value))
{
return new HtmlString(" ");
}
return new HtmlString(html.Encode(value));
}
}
und dann aus Ihrer Sicht einfach:
@Html.ValueOrSpace(myString)
Du könntest es tun:
@{
Func<dynamic, object> a = (true ?
(Func<dynamic, object>)(@<text> Works1 </text>)
: (Func<dynamic, object>)(@<text> Works2 </text>));
@a(new object());
}
Oder um es inline zu machen:
@(
((Func<dynamic, object>)(true == false
? (Func<dynamic, object>)(@<text> Works2 </text>)
: (Func<dynamic, object>)(@<text> Works3 </text>)))
(new object())
)
(Beachten Sie, dass alle oben genannten Punkte auch in einer Zeile funktionieren, ich habe sie nur zur Verdeutlichung getrennt.)
Die ursprüngliche Absicht des OP kann jedoch auch geändert werden, um zu funktionieren, aber diesmal müssen Zeilenumbrüche beibehalten werden:
@(((Func<dynamic, object>)( true == true ? (Func<dynamic,object>)(@: Works
): (Func<dynamic, object>)(@: Not Works
)))("").ToString())
Notiz
Tatsächlich brauchen Sie den Cast nur für eine der Optionen im Operator, und Sie müssen Func auch nicht dynamic als erste Option geben, Sie können einfach alles geben, und beim Auswerten können Sie genauso lange alles geben es passt das erste Argument zu Func.
Sie können beispielsweise Folgendes tun (was meiner Meinung nach die kürzeste Version ist):
@(
((Func<int, object>)(true == false
? (Func<int, object>)(@<text> Works2 </text>)
: @<text></text>))
(0)
)
Wenn Sie es häufig verwenden, wäre es eine gute Idee, Func wie in zu erben
public class Razor : Func<dynamic, object>{}
Oder man kann sogar eine Wrapper-Methode schreiben (oder in diesem Fall sogar einen Lambda-Ausdruck [I am not sure but it might be possible] um einen regulären ternären Operator zu verwenden und die Umwandlung an den Aufgerufenen zu verschieben) für den ternären Operator.
Ein weiterer aktualisierter Ansatz dank neuer Funktionen ist das Erstellen einer Hilfsfunktion direkt in der Ansicht. Dies hat den Vorteil, dass die Syntax etwas sauberer wird, insbesondere wenn Sie sie mehr als einmal aufrufen. Dies ist auch sicher vor Cross-Site-Scripting-Angriffen, ohne dass @Html.Encode() aufgerufen werden muss, da es nicht auf @Html.Raw() angewiesen ist.
Fügen Sie einfach Folgendes ganz oben in Ihre Ansicht ein:
@helper NbspIfEmpty(string value) {
if (string.IsNullOrEmpty(value)) {
@:
} else {
@value
}
}
Dann können Sie die Funktion wie folgt verwenden:
<div id="test">
@NbspIfEmpty(myString)
</div>
@(string.IsNullOrEmpty(myString)? ": ": myString)
ähm … inwiefern ist das keine echte Frage? Wenn Sie es nicht verstehen, sollten Sie vielleicht um Klärung bitten, anstatt zu versuchen, es zu schließen.
– Angst vor dem Wackplaneten
28. Juli 2011 um 10:07 Uhr
Was passiert, wenn Sie einfach @: mit ” “? Wozu brauchst du das @:?
– Jamie Dixon
28. Juli 2011 um 10:11 Uhr
@Jamie: es schreibt
zur Seite (als String, nicht als HTML-Code)– Angst vor dem Wackplaneten
28. Juli 2011 um 10:13 Uhr
Wenn das der Fall ist, muss irgendwo ein HTMLEncode vor sich gehen. Wenn Sie sich die Quelle dafür ansehen, vermute ich, dass es sich um Folgendes handelt: & nbsp;
– Jamie Dixon
28. Juli 2011 um 10:15 Uhr