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>

@ 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)

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)
};

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)    

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?


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)

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")
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.