HTML-Literal im ternären Razor-Ausdruck

Lesezeit: 4 Minuten

Benutzer-Avatar
angst vor einem wackplaneten

Ich versuche, etwas wie das Folgende zu tun

<div id="test">
    @(
        string.IsNullOrEmpty(myString)
          ? @:&nbsp;
          : myString   
    )
</div>

Die obige Syntax ist ungültig, ich habe eine Reihe verschiedener Dinge ausprobiert, kann sie aber nicht zum Laufen bringen.

  • ä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 &nbsp; 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

Benutzer-Avatar
Darin Dimitrow

Versuche Folgendes:

@Html.Raw(string.IsNullOrEmpty(myString) ? "&nbsp;" : 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("&nbsp;");
        }
        return new HtmlString(html.Encode(value));
    }
}

und dann aus Ihrer Sicht einfach:

@Html.ValueOrSpace(myString)

  • Nein, das funktioniert auch nicht (druckt die  -Zeichenfolge). Ich mag die Idee des HTML-Helfers. (Es ist auch einfach in der Ansicht mit einer if/else-Anweisung). Ich war neugierig, die Syntax als Lernübung herauszufinden, da ich Razor ziemlich neu bin.

    – Angst vor dem Wackplaneten

    28. Juli 2011 um 10:18 Uhr


  • @fearofawhackplanet, das sollte funktionieren. Sie müssen etwas vergessen haben. Hast du das bemerkt Html.Raw am Anfang meines Ausdrucks? Aufgrund der Verwendung von Html.Raw am Anfang müssen Sie sicherstellen, dass die Zeichenfolge ordnungsgemäß HTML-codiert wird, falls sie nicht leer ist.

    – Darin Dimitrow

    28. Juli 2011 um 11:06 Uhr


  • Ah… äh, das ist seltsam. Ich habe es gerade noch einmal überprüft und Sie haben Recht, es funktioniert. Es schien gestern nicht zu funktionieren, ich muss mich wohl irgendwo vertippt haben. Vielen Dank!

    – Angst vor dem Wackplaneten

    29. Juli 2011 um 10:58 Uhr

  • Gah, danke, Darin. Ich habe Html.Raw() auf eine Seite des Ternärs gesetzt, was immer wieder Probleme verursachte. Habe gar nicht daran gedacht es nach draußen zu stellen. SMH.

    – John Washam

    9. Mai 2014 um 19:20 Uhr

Benutzer-Avatar
joel halb

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.

  • das ist sehr edel 🙂

    – Transformator

    5. Januar 2018 um 1:11 Uhr

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)) {
    @:&nbsp;
  } else {
    @value
  }
}

Dann können Sie die Funktion wie folgt verwenden:

<div id="test">
    @NbspIfEmpty(myString)
</div>

@(string.IsNullOrEmpty(myString)? ":&nbsp;": myString)

1036390cookie-checkHTML-Literal im ternären Razor-Ausdruck

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy