mus*_*fan 17 javascript razor asp.net-mvc-3
我正在使用ASP.Net MVC 3 Razor视图引擎.
我需要根据View Model中的值在View中生成一些JavaScript代码.我需要使用的值是一个布尔值,本例中我们可以调用它IsSet.
所以我想要做的是创建一个基于此值的JavaScript布尔值,稍后我可以在脚本中使用它.
请记住,对于以下所有示例,我在我的视图顶部都有这些代码...
@{ string IsSet = Model.IsSet ? "true" : "false"; }
Run Code Online (Sandbox Code Playgroud)
注意:以下所有示例均为JavaScript.
第一次尝试 ......
var IsSet = @(IsSet);
Run Code Online (Sandbox Code Playgroud)
...这实际上有效,问题是由于格式错误的JavaScript,它会破坏 VS 2010中的自动格式化(CTRL + E,D) - 正如您所料,这是不可接受的.
第二次尝试 ......
var IsSet = "@(IsSet)";
Run Code Online (Sandbox Code Playgroud)
...我知道,JavaScript很聪明,它会在需要时自动解析我的字符串.哎呀,忘了它是一个字符串类型,除了空之外的任何东西都评估为true.
第三次尝试 ......
var IsSet = Boolean("@(IsSet)");
Run Code Online (Sandbox Code Playgroud)
....肯定这会工作...不,再次将非空字符串转换为true(糟糕的解析器!)
第四次尝试 ......
var IsSet = "@(IsSet)" === "true";
Run Code Online (Sandbox Code Playgroud)
最后一些有用的东西,但它对我来说并不好看.
如果需要我会使用它,但最终我的问题是:有没有更好的方法来处理这种情况?也许,我第一次尝试中的不受欢迎的行为只是微软可能忽略的事情?
如果有人对我进行了第五次尝试,那就太好了.
对我来说重要的是VS 2010中的自动格式化不会中断
谢谢
use*_*221 14
我刚刚用同样的问题摔了一个小时.我的最终解决方案相当于以下内容.
var IsSet = @(Model.IsSet.ToString().ToLower()); // Inside JavaScript block
Run Code Online (Sandbox Code Playgroud)
这不需要额外的代码.
Dar*_*rov 10
到目前为止所显示的版本(在问题和答案中都没有)是我将要使用的.我是这样做的:
@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>
Run Code Online (Sandbox Code Playgroud)
或者如果您需要使用javascript操作视图模型的其他属性,您可以对整个模型进行JSON编码:
@model MyViewModel
<script type="text/javascript">
var model = @Html.Raw(Json.Encode(Model));
if (model.IsSet) {
alert(model.FooBar);
}
</script>
Run Code Online (Sandbox Code Playgroud)
版本1是我投票的唯一一个,即使它们都有效,因为它是最人性化的.不幸的是我家里没有VS所以我无法尝试看看自动格式化问题是什么,但如果可能的话我想忽略这个问题并继续使用那个版本,因为那里有代码没有什么问题 - 只是VS很困惑.(你是说VS试图将整个事物解释为JS,从而发现它无效吗?)
但如果你想要一些其他的选择:
第五次尝试......
@{ string IsSet = Model.IsSet ? "true" : ""; }
var isSet = !!"@(IsSet)";
// OR
var isSet = Boolean("@(IsSet)");
Run Code Online (Sandbox Code Playgroud)
使用旧的双非运算符技巧将字符串值强制转换为布尔值 - 正如您已经指出的那样,"true"和"false"都将成为现实,但如果使用"true"和""(空,则此问题会消失)字符串) - 所以你可以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)");
Run Code Online (Sandbox Code Playgroud)
好的,所以你最终会在页面顶部找到一个相当无意义的函数,但它会使实际的变量声明保持合理的整洁,如果调试客户端你会看到bool("false")或bool("true").
第七次尝试......
我不喜欢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 ""
Run Code Online (Sandbox Code Playgroud)
我希望我的所有"尝试"都有效,但我认为你的"第一次尝试"是最好的选择.
| 归档时间: |
|
| 查看次数: |
12246 次 |
| 最近记录: |