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.