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>

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

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

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)    

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”


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)

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")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.