Używając Razor, jak wyrenderować wartość logiczną do zmiennej JavaScript?

144

Jak wyrenderować wartość logiczną do zmiennej JavaScript w pliku cshtml?

Obecnie pokazuje to błąd składni:

<script type="text/javascript" >

    var myViewModel = {
        isFollowing: @Model.IsFollowing  // This is a C# bool
    };
</script>
Nikos
źródło
@ nie jest prawidłowym operatorem JS. Oznacza to, że może wystąpić tylko w smyczkach
Ivan Kuckir
to pytanie sprawia, że ​​czuję się stary
Nikos
Nie wiem, co to jest T #, więc założyłem, że oznacza to C # @Nikos;)
Mafii
twój komentarz nie ma sensu
Nikos
wow to Qu naprawdę uderzyło w Rep
Nikosa

Odpowiedzi:

298

Możesz także spróbować:

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

a coraz lepszym sposobem jest użycie:

isFollowing: @Json.Encode(Model.IsFollowing)
inny_użytkownik
źródło
63
@Json.Encode(Model.IsFollowing)to imho najbardziej eleganckie rozwiązanie. Dziękuję Ci!
Sandro,
2
Zwykle będzie używanych więcej niż jedna wartość logiczna, w którym to przypadku kodowanie całego modelu sprawia, że ​​później jest przyjemny i łatwy w użyciu. np .: var model = @ Html.Raw (Json.Encode (Model)); a potem możesz po prostu zadzwonić do modelu IsFollowing (Przepraszam, nie wiem, jak poprawnie sformatować kod komentarza)
Jynn
Dodaj, @using System.Web.Helpersaby uzupełnić kod.
taylorswiftfan
29

Wartość logiczna JSON musi być zapisana małymi literami.

Dlatego spróbuj tego (i upewnij się, że nie ma //komentarza w wierszu):

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

Lub (uwaga: musisz użyć przestrzeni nazw System.Xml):

var myViewModel = {
    isFollowing: @XmlConvert.ToString(Model.IsFollowing)
};
Lucero
źródło
1
Podejście .ToString () jest prawdopodobnie najbardziej wydajne. Używanie „@ Model.IsFollowing.ToString (). ToLowerInvariant ()” musi być nieco wydajniejsze i nieco prostsze.
XDS
Korzystanie z metody ciąg i obniżania jest zdecydowanie najczystsze w mojej opcji, ponieważ ładnie się czyta w javascript.
Frank Thomas
28

Ponieważ wyszukiwanie przyniosło mnie tutaj: w ASP.NET Core IJsonHelpernie ma Encode()metody. Zamiast tego użyj Serialize(). Na przykład:

isFollowing: @Json.Serialize(Model.IsFollowing)    
Marc L.
źródło
3
Dziękujemy za wzmiankę o asp.net core!
Sharif Mamun,
13
var myViewModel = {
    isFollowing: '@(Model.IsFollowing)' == "True";
};

Dlaczego Truei nie truepytasz ... Dobre pytanie:
dlaczego Boolean.ToString wyświetla „True”, a nie „true”

gdoron wspiera Monikę
źródło
Nie ma co kwestionować, ale czy kodowanie jest @Model.IsFollowingrzeczywiście prawidłową składnią JS? A może opiera się na fakcie, że będzie to spowodowane faktem, że jest to wartość logiczna?
gahooa
@ Model.IsFollowing to składnia brzytwy, a nie js
Nikos
@gahooa, nie, nie jest, jest analizowany na serwerze z silnikiem Razor.
gdoron wspiera Monikę
@Nikos, spróbuj:'@(Model.IsFollowing)'
gdoron wspiera Monikę
@Nikos, czy próbowałeś go uruchomić? wiele razy jest to tylko problem z Visual Studio, ale działa idealnie. Spróbuj go uruchomić!
gdoron wspiera Monikę
4

Oto kolejna opcja do rozważenia, używając !! konwersja na wartość logiczną.

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

Spowoduje to wygenerowanie następującego po stronie klienta, przy czym 1 zostanie przekonwertowany na prawdę, a 0 na fałsz.

isFollowing: !!(1)  -- or !!(0)
Stuart Hallows
źródło
drobna korekta !! @ (Model.IsFollowing? 1: 0) działa świetnie
kurczak
3

Rozwiązaniem, które jest łatwiejsze do odczytania, byłoby zrobienie tego:

isFollowing: @(Model.IsFollowing ? "true" : "false")
marxlaml
źródło