Используя Razor, как я могу отобразить логическое значение для переменной JavaScript?

144

Как я могу представить логическое значение переменной JavaScript в файле cshtml?

В настоящее время это показывает синтаксическую ошибку:

<script type="text/javascript" >

    var myViewModel = {
        isFollowing: @Model.IsFollowing  // This is a C# bool
    };
</script>
Nikos
источник
@ не является действительным оператором JS. Это означает, что это может происходить только в строках
Иван Кукир
этот вопрос заставляет меня чувствовать себя старым
Никос
Я не знаю, что такое T #, поэтому я предположил, что это означало C # @Nikos;)
Mafii
Ваш комментарий не имеет смысла
Nikos
вау, этот Ку действительно ударил Реп
Никос

Ответы:

298

Вы также можете попробовать:

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

и лучший способ использовать:

isFollowing: @Json.Encode(Model.IsFollowing)
another_user
источник
63
@Json.Encode(Model.IsFollowing)IMHO самое элегантное решение. Спасибо!
Сандро
2
Обычно будет использоваться более одного логического значения, и в этом случае кодирование всей модели делает вещи удобными и простыми в использовании. например: var model = @ Html.Raw (Json.Encode (Model)); и тогда вы можете просто вызвать model.IsFollowing (извините, я не знаю, как правильно отформатировать код комментария)
Jynn
Добавьте, @using System.Web.Helpersчтобы завершить код.
taylorswiftfan
29

Логическое значение JSON должно быть в нижнем регистре.

Поэтому попробуйте это (и убедитесь, что у вас есть //комментарий к строке):

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

Или (примечание: вам нужно использовать пространство имен System.Xml):

var myViewModel = {
    isFollowing: @XmlConvert.ToString(Model.IsFollowing)
};
Лусеро
источник
1
Подход .ToString (), вероятно, является наиболее эффективным. Использование '@ Model.IsFollowing.ToString (). ToLowerInvariant ()' должно быть немного более эффективным и несколько более простым.
XDS
Использование метода, для строки и понижения, безусловно, является самым чистым в моем варианте, так как он хорошо читается в JavaScript.
Фрэнк Томас
28

Потому что поиск привел меня сюда: в ASP.NET Core IJsonHelperнет Encode()метода. Вместо этого используйте Serialize(). Например:

isFollowing: @Json.Serialize(Model.IsFollowing)    
Марк Л.
источник
3
Спасибо за упоминание ядра asp.net!
Шариф Мамун
13
var myViewModel = {
    isFollowing: '@(Model.IsFollowing)' == "True";
};

Почему бы Trueи не trueспросить ... Хороший вопрос:
почему Boolean.ToString выводит "True", а не "true"

Гдорон поддерживает Монику
источник
Не ставить это под сомнение, но является ли кодировка @Model.IsFollowingдействительного синтаксиса JS? Или это полагается на факт, что это будет, потому что это случается, чтобы быть логическим?
gahooa
@ Model.IsFollowing - это синтаксис бритвы, а не js
Никос
@gahooa, нет, это не так, он анализируется на сервере с движком Razor.
Гдорон поддерживает Монику
@ Никос, тогда попробуй:'@(Model.IsFollowing)'
Гдорон поддерживает Монику
@Nikos, ты пробовал запустить? часто это просто проблема Visual Studio, но она работает отлично. Попробуйте запустить его!
Гдорон поддерживает Монику
4

Вот еще один вариант для рассмотрения, используя !! преобразование в логическое значение.

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

Это сгенерирует следующее на стороне клиента: 1 будет преобразовано в true, а 0 в false.

isFollowing: !!(1)  -- or !!(0)
Стюарт Хэллоуз
источник
небольшая коррекция !! @ (Model.IsFollowing? 1: 0) отлично работает
курица
3

Решение, которое легче читать, было бы сделать это:

isFollowing: @(Model.IsFollowing ? "true" : "false")
marxlaml
источник