使用 Razor,如何将布尔值呈现给 JavaScript 变量?

如何在 cshtml 文件中将 Boolean 呈现为 JavaScript 变量?

目前这里显示了一个语法错误:

<script type="text/javascript" >


var myViewModel = {
isFollowing: @Model.IsFollowing  // This is a C# bool
};
</script>
95357 次浏览
var myViewModel = {
isFollowing: '@(Model.IsFollowing)' == "True";
};

为什么你问的是 True而不是 true... 好问题:
为什么 Boolean. ToString 输出为“ True”而不是“ True”

JSON 布尔值必须是小写的。

因此,请尝试这样做(并确保行中有 //注释) :

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

或者(注意: 您需要使用名称空间 System.Xml) :

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

你也可以试试:

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

更好的方法是:

isFollowing: @Json.Encode(Model.IsFollowing)

下面是另一个需要考虑的选项,使用! ! 转换为 boolean。

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

这将在客户端生成以下内容,其中1被转换为 true,0被转换为 false。

isFollowing: !!(1)  -- or !!(0)

因为一次搜索把我带到了这里: 在 ASP.NET Core 中,IJsonHelper没有 Encode()方法,而是使用 Serialize():

isFollowing: @Json.Serialize(Model.IsFollowing)

一个更容易理解的解决办法是这样做:

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

定义转换操作 并添加重写 .ToString()可以节省大量工作。

在项目中定义这个 struct:

/// <summary>
/// A <see cref="bool"/> made for use in creating Razor pages.
/// When converted to a string, it returns "true" or "false".
/// </summary>
public struct JSBool
{
private readonly bool _Data;


/// <summary>
/// While this creates a new JSBool, you can also implicitly convert between the two.
/// </summary>
public JSBool(bool b)
{
_Data = b;
}


public static implicit operator bool(JSBool j) => j._Data;
public static implicit operator JSBool(bool b) => new JSBool(b);


// Returns "true" or "false" as you would expect
public override string ToString() => _Data.ToString().ToLowerInvariant();
}

用法

你可以直接选择 C # bool,就像这个问题一样:

{
// Results in `isFollowing : true`
isFollowing : @((JSBool)Model.IsFollowing)
}

但是你也可以直接在 Razor 代码中使用 JSBool,期望它能给出 truefalse,而不需要做任何额外的工作:

@{
JSBool isA = true;
JSBool isB = false;
// Standard boolean operations work too:
JSBool isC = a || b;
}


<script>
if (@isC)
console.log('true');
</script>

这是因为我们在上面定义了隐式转换运算符。


只要确保只有在您打算在 Razor 代码中使用它时才使用它。换句话说,不要将它与普通的 C # 一起使用,因为这会使代码变得混乱。