将布尔值传递到我的.NET MVC视图中的JavaScript,但JS不接受True,希望是true。

18

我在我的.net mvc动作页中向javascript函数传递一个布尔值。

问题是,它输出的值为True,而javascript显然只接受小写的'true'。

我不想在我的动作中修改变量并将其转换为字符串并转换为小写,但看起来我别无选择?

7个回答

18

如果你正在使用.NET布尔型的ToString()方法来将值发送到Javascript,请尝试将其替换为类似以下的内容:

(myBoolean ? "true" : "false")

以便将其作为所需布尔值的适当字符串表示发送到JavaScript。

编辑:请注意以下区别:

<script type="text/javascript">
var myBoolean = <%= (myBoolean ? "true" : "false") %>;
</script>
并且
<script type="text/javascript">
var myBoolean = '<%= (myBoolean ? "true" : "false") %>';
</script>
在第一个例子中,最终会得到:
var myBoolean = false;

那是一个字面上的布尔值false。在第二种情况下,你最终得到:

var myBoolean = 'false';

在JavaScript中,'false'是一个非空字符串,因此如果在布尔上下文中计算它,它将为true。好吧,准确来说是“类似于true”。:)


实际上,在JavaScript中,1不是真的,而0是假的。 - mrblah
我是正确的还是1代表真实,我猜w3schools可能是错的,因为这没有意义呵呵。 - mrblah
显然,在Javascript中,字符串“false”会被解析为true,因此只有当你的值为true时才能起作用。如果myBoolean是false,那么javascript变量将是val theValue =“false”,这将等于true而不是false。 - Stephen Price
@StephenPrice - 是的,在JS中,字符串“false”是真的 - 要使用此示例,您需要调用.NET表达式,以便JS将输出解释为布尔文字,而不是字符串。 - Dylan Beattie
2
@StephenPrice 在JavaScript中,真实性(Truthiness)的行为相当奇怪。在JavaScript中,除了1969年12月31日午夜的那一刻(因为JS使用1970年01/01 00:00:00作为纪元),每个日期/时间都被视为真。我曾经在一个JavaScript讲座中提到过这一点,然后一个老嬉皮士程序员插话说:“是啊,我当时就在那里...大家都在庆祝新年前夕的午夜。阿姆斯特朗已经登上了月球,我们刚刚度过了充满爱与和平的夏天,一切看起来都非常美好和乐观。回想起来,那显然是虚假的...” :) - Dylan Beattie
显示剩余2条评论

6

我创建了一个扩展方法,可以在任何模型的布尔属性中使用。

    public static class GeneralExtensions
    {
    public static string GetValueForJS(this bool argValue)
        {
            return argValue ? "true" : "false"; 
        }
     }

现在,我可以简单地使用以下视图:
<script type="text/javascript">
    var variable = @Model.IsFoo.GetValueForJS();
</script>

1
+1 我会把它称为更短的名称,比如"ToJS",但这比在视图中污染'? "true" : "false"'要好。 - Sebastian K

3

如果您需要经常执行此操作,只需将以下内容添加到JavaScript(或您的JS库文件等)的顶部即可:

var True = true; False = false;

在简单的一次性情况下使用:

var x = ('<%= boolValue %>'=='True' );

2

对我来说,这种方法很有效(MVC4)

<script type="text/javascript">

if (@{if (Model.IsSubmitted) { @Html.Raw("true"); } else { @Html.Raw("false"); } } == true)
{
// code
}

</script>

2
或者简单地写成 if (@Html.Raw(Model.IsSubmitted?"true":"false")) - Andreas Willadsen

1
你可以使用 JavaScript 的 Boolean() 方法。
if (Boolean(value)) {}

2
Boolean("false")是真的,而不是假的。 - Stephen Price
1
这个不起作用:Boolean(@Model.MyBool) 会给你 Boolean(True) 或 Boolean(False),两者都会给出 True 或 False 未定义的错误。 - ctb

0
你想使用这个:
(.NET 3.5) System.Web.Script.Serialization.JavaScriptSerializer.Serialize

1
请问这个命名空间的重载是开玩笑吗? - Rakesh Pai
通常情况下,您可以使用JSON序列化器System.Runtime.Serialization.Json.DataContractJsonSerializer。但是JavaScriptSerializer仍然存在,您可以用它来进行简单的直接类型序列化。http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx - John Liu

0
我写了一个公共的js方法,当我需要检查从JavaScript中的操作传递的布尔变量时,只需将原始值发送到此方法进行解析。
function GetBooleanValue(value) {
if (value == undefined) return false;

var parsedValue = value.toLowerCase();

if (parsedValue === "false") return false;
else if (parsedValue === "true") return true;
else return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接