在JavaScript中使用简单的Razor代码

在JavaScript中使用简单的Razor代码,razor,asp.net-mvc-4,Razor,Asp.net Mvc 4,我正在使用Visual Studio 2012 RC和ASP.NET MVC 4。这让我发疯,我知道这已经被问了好几次了,但我找不到MVC4的解决方案,也找不到MVC3的统一解决方案。我一定错过了什么 我只想在javascript块中输出一个c#变量。这应该是微不足道的,并且是能够做到这一点的必要条件,但尽管我尝试了所有的变通方法/技巧,但没有任何东西能够消除“关闭条件编译”错误。如果这只是一个警告,那就好了,但这是一个错误。如果我关闭VisualStudio内部的视图,它会编译并正常工作,但是

我正在使用Visual Studio 2012 RC和ASP.NET MVC 4。这让我发疯,我知道这已经被问了好几次了,但我找不到MVC4的解决方案,也找不到MVC3的统一解决方案。我一定错过了什么

我只想在javascript块中输出一个c#变量。这应该是微不足道的,并且是能够做到这一点的必要条件,但尽管我尝试了所有的变通方法/技巧,但没有任何东西能够消除“关闭条件编译”错误。如果这只是一个警告,那就好了,但这是一个错误。如果我关闭VisualStudio内部的视图,它会编译并正常工作,但是如果它是打开的,我甚至无法编译,这是不可接受的

我试过使用
/*@cc\u on@*/
/*@(“cc\u on@”)*/
来打开条件编译,但没有效果。执行
@(serverVar)
会产生无效字符错误(@)。我还尝试了
@Html.Raw
和其他一些东西

我包含razor代码而不出错的唯一方法是,razor代码是否包含在引号中,这对字符串很有效,但对int和bool无效

@{
    int serverVar = 5;
}

<script>
    var obj = { jsVar: @serverVar };
</script>
@{
int-serverVar=5;
}
var obj={jsVar:@serverVar};

我到处都在寻找这个问题,但找不到一致同意的解决方案。我错过什么了吗?非常感谢您的帮助。

嗯,我想没有办法消除这个错误,因为它仍然可以编译,所以一切都非常棒。

使用JavaScriptModel()

通过这种方式,您可以轻松地将服务器端变量转换为javascript,而无需烦人的内联javascript

您只需在控制器操作中编写以下代码:

this.AddJavaScriptVariable("VariableNameInJavaScript", serverVar);
如果您希望在每个页面上设置多个变量,请使用如下所述的过滤器:

编辑: 如果你有很多变量,你应该对它们进行分类,并将它们添加到不同的文本中。 例如


我用下面的技巧解决了这个问题


var supportedNumber=Number(@TempData[“supportedNumber”])

您得到的错误是什么?当我把你的代码块粘贴到一个页面上时(也是VS2012上的MVC4,尽管不是RC),它对我来说很有用,给出
var obj={jsVar:5}作为脚本主体。那一定是RC的东西。我得到一个“条件编译已关闭”错误。当视图在VisualStudio中打开时,会显示错误,并且我无法编译。如果我关闭视图,我就可以编译,并且它确实可以按预期工作。但是,在任何情况下都不应该存在阻止我编译的错误。唯一可行的方法是如果它污染了全局名称空间(例如,向窗口对象添加变量)。我希望所有东西都封装在我创建的一个全局对象中。尽管如此,这是一个非常有趣的解决方案,我对此投了赞成票。此外,在他们的示例中,他们仍然有这样一个:
@this.RenderJavaScriptModelInit()
,这意味着您仍然必须在javascript块中嵌入c#调用,因此错误仍然会出现。我只需要使用其中的服务器变量进行一次MyGlobalJSObj.init()调用。我认为html助手可能是实现这一点的最佳方法。您的问题中的代码污染了全局命名空间。。。事实上,每个代码都。。。您只能封装变量。您还可以使用文字对象。例如,如果你有一个配置,使用“Config.VariableName”作为javascript变量,你就得到了一个可以从javascript函数中使用的配置对象。我的例子过于简化了。我已经创建了一个全局对象,只要我可以添加“MyGlobalObj.Var”,并且它不会覆盖我的对象,那就好了。然而,如果你看我的第二条评论,在javascript块中使用c#仍然是一个问题。
this.AddJavaScriptVariables("Config.UserId", userId,
    "Config.SomeOtherConfig", someOtherConfigValue,
    "MyGoogleMapController.Pushpins", GetMapPushpins());