Wie rendere ich mit Razor einen Booleschen Wert in eine JavaScript-Variable?

144

Wie rendere ich einen Booleschen Wert in eine JavaScript-Variable in einer cshtml-Datei?

Derzeit zeigt dies einen Syntaxfehler:

<script type="text/javascript" >

    var myViewModel = {
        isFollowing: @Model.IsFollowing  // This is a C# bool
    };
</script>
Nikos
quelle
@ ist kein gültiger JS-Operator. Es bedeutet, dass es nur in Strings auftreten kann
Ivan Kuckir
Diese Frage macht mich alt
Nikos
Ich weiß nicht, was T # ist, also nahm ich an, dass dies C # @Nikos bedeutete;)
Mafii
Ihr Kommentar macht keinen Sinn
Nikos
Wow, dieser Qu hat den Rep
Nikos am

Antworten:

298

Vielleicht möchten Sie auch versuchen:

isFollowing: '@(Model.IsFollowing)' === '@true'

und ein immer besserer Weg ist zu verwenden:

isFollowing: @Json.Encode(Model.IsFollowing)
Ein anderer Benutzer
quelle
63
@Json.Encode(Model.IsFollowing)ist imho die eleganteste lösung. Danke dir!
Sandro
2
Normalerweise wird mehr als ein Boolescher Wert verwendet. In diesem Fall macht die Codierung des gesamten Modells die Dinge danach schön und einfach zu verwenden. zB: var model = @ Html.Raw (Json.Encode (Model)); und dann können Sie einfach model.IsFollowing aufrufen (Entschuldigung, ich weiß nicht, wie ich den Kommentarcode richtig
formatieren soll
Hinzufügen @using System.Web.Helpers, um den Code zu vervollständigen.
taylorswiftfan
29

Der JSON-Boolesche Wert muss in Kleinbuchstaben angegeben werden.

Versuchen Sie dies daher (und stellen Sie sicher, dass der //Kommentar in der Zeile steht):

var myViewModel = {
    isFollowing: @Model.IsFollowing.ToString().ToLower()
};

Oder (Hinweis: Sie müssen den Namespace verwenden System.Xml):

var myViewModel = {
    isFollowing: @XmlConvert.ToString(Model.IsFollowing)
};
Lucero
quelle
1
Der .ToString () -Ansatz ist wahrscheinlich der effizienteste. Die Verwendung von '@ Model.IsFollowing.ToString (). ToLowerInvariant ()' muss etwas effizienter und etwas unkomplizierter sein.
XDS
Die Methode zu verwenden, zu fädeln und zu senken ist definitiv die sauberste in meiner Option, da sie gut in Javascript liest.
Frank Thomas
28

Weil mich eine Suche hierher gebracht hat: In ASP.NET Core IJsonHelpergibt es keine Encode()Methode. Verwenden Sie stattdessen Serialize(). Z.B:

isFollowing: @Json.Serialize(Model.IsFollowing)    
Marc L.
quelle
3
Vielen Dank für die Erwähnung von asp.net core!
Sharif Mamun
13
var myViewModel = {
    isFollowing: '@(Model.IsFollowing)' == "True";
};

Warum Trueund nicht truefragen Sie ... Gute Frage:
Warum gibt Boolean.ToString "True" und nicht "true" aus?

Gdoron unterstützt Monica
quelle
Nicht in Frage zu stellen, aber ist die Kodierung der @Model.IsFollowingtatsächlich gültigen JS-Syntax? Oder beruht es auf der Tatsache, dass es sein wird, weil es zufällig boolesch ist?
Gahooa
@ Model.IsFollowing ist Rasiermessersyntax, nicht js
Nikos
@gahooa, nein, ist es nicht, es wird auf dem Server mit der Razor-Engine analysiert.
Gdoron unterstützt Monica
@ Nikos, dann versuchen Sie:'@(Model.IsFollowing)'
Gdoron unterstützt Monica
@ Nikos, hast du versucht, es auszuführen? Oft ist es nur ein Visual Studio-Problem, aber es läuft einwandfrei. Versuchen Sie es!
Gdoron unterstützt Monica
4

Hier ist eine weitere Option, die Sie in Betracht ziehen sollten, indem Sie das !! Konvertierung in Boolesche Werte.

isFollowing: !!(@Model.IsFollowing ? 1 : 0)

Dadurch wird auf der Clientseite Folgendes generiert, wobei 1 in true und 0 in false konvertiert wird.

isFollowing: !!(1)  -- or !!(0)
Stuart Hallows
quelle
kleine Korrektur !! @ (Model.IsFollowing? 1: 0) funktioniert super
Huhn
3

Eine Lösung, die leichter zu lesen ist, wäre Folgendes:

isFollowing: @(Model.IsFollowing ? "true" : "false")
Marxlaml
quelle