繁体   English   中英

MVC 3 Razor View:从布尔模型值生成JavaScript

[英]MVC 3 Razor View: Generating JavaScript from a boolean model value

我正在使用ASP.Net MVC 3 Razor视图引擎。

我需要根据View Model中的值在View中生成一些JavaScript代码。 我需要使用的值是布尔值,对于此示例,我们将其称为IsSet

所以我想要做的是创建一个基于此值的JavaScript布尔值,稍后我可以在脚本中使用它。

请记住,对于以下所有示例,我在我的视图顶部都有这些代码...

@{ string IsSet = Model.IsSet  ? "true" : "false"; }

注意 :以下所有示例均为JavaScript。

第一次尝试 ......

var IsSet = @(IsSet);

...这实际上有效, 问题是由于格式错误的JavaScript, 它会破坏 VS 2010中的自动格式化 (CTRL + E,D) - 正如您所料,这是不可接受的。

第二次尝试 ......

var IsSet = "@(IsSet)";

...我知道,JavaScript很聪明,它会在需要时自动解析我的字符串。 哎呀,忘了它是一个字符串类型,除了空之外的任何东西都评估为true。

第三次尝试 ......

var IsSet = Boolean("@(IsSet)");

....肯定这会工作...不,再次将非空字符串转换为true(糟糕的解析器!)

第四次尝试 ......

var IsSet = "@(IsSet)" === "true";

最后一些有用的东西,但它对我来说并不好看。

如果需要我会使用它,但最终我的问题是:有没有更好的方法来处理这种情况? 也许,我第一次尝试中的不受欢迎的行为只是微软可能忽略的事情?

如果有人对我进行了第五次尝试,那就太好了。

对我来说重要的是VS 2010中的自动格式化不会中断

谢谢

我刚刚用同样的问题摔了一个小时。 我的最终解决方案相当于以下内容。

var IsSet = @(Model.IsSet.ToString().ToLower()); // Inside JavaScript block

这不需要额外的代码。

到目前为止所显示的版本(在问题和答案中都没有)是我将要使用的。 我是这样做的:

@model MyViewModel
<script type="text/javascript">
    var isSet = @Html.Raw(Json.Encode(Model.IsSet));

    // TODO: use the isSet javascript variable here as a standard boolean value
</script>

或者如果您需要使用javascript操作视图模型的其他属性,您可以对整个模型进行JSON编码:

@model MyViewModel
<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));

    if (model.IsSet) {
        alert(model.FooBar);
    }
</script>

版本1是我投票的唯一一个,即使它们都有效,因为它是最人性化的。 不幸的是我家里没有VS所以我无法尝试看看自动格式化问题是什么,但如果可能的话我想忽略这个问题并继续使用那个版本,因为那里有代码没有什么问题 - 只是VS很困惑。 (你是说VS试图将整个事物解释为JS,从而发现它无效?)

但如果你想要一些其他的选择:

第五次尝试......

@{ string IsSet = Model.IsSet  ? "true" : ""; }

var isSet = !!"@(IsSet)";
// OR
var isSet = Boolean("@(IsSet)");

使用旧的双非运算符技巧将字符串值强制转换为布尔值 - 正如您已经指出的那样,“true”和“false”都将成为现实,但如果使用“true”和“”(空,则此问题会消失) string) - 所以你可以根据你的“第三次尝试”使用Boolean()

第六次尝试......

@{ string IsSet = Model.IsSet  ? "true" : "false"; }

// helper function at the top of your page:
function bool(strVal) {
   return strVal === "true";
}

// variable declaration
var isSet = bool("@(IsSet)");

好的,所以你最终在页面的顶部有一个相当无意义的函数,但它保持实际的变量声明合理整洁,如果调试客户端你会看到bool("false")bool("true")

第七次尝试......

我不喜欢创建服务器端string IsSet = Model.IsSet ? "true" : "false";的额外步骤string IsSet = Model.IsSet ? "true" : "false"; string IsSet = Model.IsSet ? "true" : "false"; 提前。 我不知道Razor语法,但你能说出一些基本的话:

var isSet = !!"@(Model.IsSet ? "true" : "")";
// OR, better:
var isSet = !!"@(rzrBool(Model.IsSet))";
// where rzrBool() is a server-side helper function (that you would create)
// which returns "true" or ""

我希望我的所有“尝试”都有效,但我认为你的“第一次尝试”是最好的选择。

怎么样:

@Ajax.ToJson(Model.IsSet)
var isSet = /true/i.test('@Model.IsSet');
  • 单线
  • 处理.Net和JavaScript之间的区别
  • 使用自动格式化(Visual Studio和带有Resharper的Visual Studio)
  • 如果您熟悉JavaScript正则表达式,则合理惯用
  • 对逻辑错误具有相当的弹性; 它应该按预期执行或抛出JavaScript错误(或可能是Razor编译错误)。

这是我在javascript块中使用的内容:

var someValue;
@{ var someValue= "someValue= " + Model.SomeValue+ ";"; }
@someValue

我知道这是一个老问题,但没有一个答案特别优雅。

在这些情况下最简单的解决方案就是将+0附加到条件。 这会隐式地将bool转换为int,但由于结果为01因此if语句会立即将其转换回来。 例:

// The space is optional
if (@IsSet +0) {
    // Do stuff
}

为变量赋值布尔值可以如下实现:

// Note the double (not triple) equals, which performs type conversion
var isSet = @IsSet+0 == true;

代码工作,你没有红色波浪线,Visual Studio格式化程序很高兴。

怎么样:

@Model.IsSet.ToString().ToLower()
var isSet= @((bool)Model.IsSet?"true":"false");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM