Usando o Razor, como renderizo um Booleano para uma variável JavaScript?

144

Como processar um booleano em uma variável JavaScript em um arquivo cshtml?

Atualmente, isso mostra um erro de sintaxe:

<script type="text/javascript" >

    var myViewModel = {
        isFollowing: @Model.IsFollowing  // This is a C# bool
    };
</script>
Nikos
fonte
@ não é um operador JS válido. Isso significa, que pode ocorrer apenas em cordas
Ivan Kuckir
esta pergunta me faz sentir velha
Nikos
Eu não sei o que é T #, então eu assumi que isso significava C # @Nikos;) #
Mafii
seu comentário não faz sentido #
Nikos
uau, este Qu realmente bateu o representante #
Nikos

Respostas:

298

Você também pode tentar:

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

e uma maneira cada vez melhor é usar:

isFollowing: @Json.Encode(Model.IsFollowing)
another_user
fonte
63
@Json.Encode(Model.IsFollowing)é a solução mais elegante. Obrigado!
Sandro
2
Normalmente, haverá mais de um booleano sendo usado; nesse caso, a codificação de todo o modelo torna as coisas agradáveis ​​e fáceis de usar a partir de então. por exemplo: var model = @ Html.Raw (Json.Encode (Model)); e então você pode apenas chamar model.IsFollowing (Desculpe eu não sei como formatar o código comentário corretamente)
Jynn
Adicione @using System.Web.Helperspara completar o código.
taylorswiftfan
29

O booleano JSON deve estar em minúsculas.

Portanto, tente isso (e certifique-se de não ter o //comentário na linha):

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

Ou (nota: você precisa usar o espaço para nome System.Xml):

var myViewModel = {
    isFollowing: @XmlConvert.ToString(Model.IsFollowing)
};
Lucero
fonte
1
A abordagem .ToString () é provavelmente a mais eficiente. O uso de '@ Model.IsFollowing.ToString (). ToLowerInvariant ()' deve ser um pouco mais eficiente e um pouco mais direto.
XDS 6/17
Usar o método, string e abaixar é definitivamente o mais limpo na minha opção, pois lê bem em javascript.
Frank Thomas
28

Porque uma pesquisa me trouxe aqui: no ASP.NET Core, IJsonHelpernão tem um Encode()método. Em vez disso, use Serialize(). Por exemplo:

isFollowing: @Json.Serialize(Model.IsFollowing)    
Marc L.
fonte
3
Obrigado por mencionar o núcleo do asp.net!
Sharif Mamun
13
var myViewModel = {
    isFollowing: '@(Model.IsFollowing)' == "True";
};

Por que você Truenão truepergunta ... Boa pergunta:
Por que o Boolean.ToString produz "True" e não "true"

gdoron está apoiando Monica
fonte
Para não questionar, mas a codificação da @Model.IsFollowingsintaxe JS é realmente válida? Ou depende do fato de que será porque é booleano?
gahooa
@ Model.IsFollowing é sintaxe de barbear, não js
Nikos
@gahooa, não, não é, é analisado no servidor com o mecanismo Razor.
gdoron está apoiando Monica
@ Nikos, então tente:'@(Model.IsFollowing)'
gdoron está apoiando Monica
@ Nikos, você tentou executá-lo? muitas vezes é apenas um problema do Visual Studio, mas funciona perfeitamente bem. Tente executá-lo!
gdoron está apoiando Monica
4

Aqui está outra opção a considerar, usando o !! conversão para booleano.

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

Isso gerará o seguinte no lado do cliente, com 1 sendo convertido em true e 0 em false.

isFollowing: !!(1)  -- or !!(0)
Stuart Hallows
fonte
pequena correcção !! @ (? Model.IsFollowing 1: 0) funciona muito bem
frango
3

Uma solução mais fácil de ler seria fazer o seguinte:

isFollowing: @(Model.IsFollowing ? "true" : "false")
marxlaml
fonte