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>

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

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

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)    

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"


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)

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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.