剃刀/ JavaScript和尾随分号

使用Visual Studio 2012,在Razor视图页面的JavaScript部分,我得到了我认为是Razor语法与JavaScript语法之间的争斗。 尤其是,脚本部分的尾部分号由智能感知标记,并提供编译器警告(不是错误):

'警告13语法错误'。

如果我删除它,那么我得到一个声明终止build议( ReSharper在这种情况下,但只是良好的做法)。

<script type="text/javascript"> $().ready(function(){ var customer = @Html.Raw(ViewBag.CustomerJSON); // <- Razor (I think) doesn't like this semicolon }); </script> 

这是Razor中的一个错误吗? 如果是的话,有没有办法可以重写这个来避免这个问题呢?

这是Razor中的一个错误吗?

绝对不。 运行你的应用程序,它会按预期工作。

这是您正在使用的工具(Visual Studio 2012,ReSharper,…)中的一个错误,它们无法识别完全有效的语法,并警告您不应该警告您的某些内容。 您可以尝试在Microsoft Connect站点上打开一个问题,如果尚未完成,则发出此错误的信号。

由于这似乎还在发生,这是一个麻烦,我想我至less会让别人知道我最终用作“黑客”。 我不想忽视这个警告,而宁愿接受一个更好的语法(是的,有人会说这会杀死性能:))

我使用的解决方法是在最后使用客户端添加。 对我来说,这个错误发生在定义一个“整数”常量,所以

 window.foo = @(Model.Something); 

给了我很好的分号错误。 我只是将其更改为:

 window.foo = @Model.Something + 0; 

(在陈述的问题的情况下,你应该只能添加'',所以+''。

我知道在客户端上还有一个额外的增加,它不是优雅的,但它确实避免了错误。 所以使用它或不,但我更喜欢这看到的警告/错误。

如果有人知道这个服务器端的语法解决方法,我更喜欢这个到客户端,所以请添加。

我发现在JavaScript身份函数中包装Razor语法也使IDE感到高兴。

 <script type="text/javascript"> @* I stands for Identity *@ function I(obj) { return obj; } $().ready(function(){ var customer = I(@Html.Raw(ViewBag.CustomerJSON)); }); </script> 

这对我工作:

 var customer = @Html.Raw(ViewBag.CustomerJSON + ";") 

这是一个布尔变通办法:

 var myBool = @(Model.MyBool ? "true;" : "false;") 

这对我有效

 @Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON)); 
 <script type="text/javascript"> $().ready(function(){ var customerName = ('@ViewBag.CustomerName'); // <- wrap in parens }); </script> 

是不是像用圆括号包装一样简单? 通过控制台的价值观似乎工作正常,没有副作用。

它适用于string,但它仍然给非报价值的错误,但我仍然喜欢这个string值。 对于数字,你可以使用parseInt('@Model.TotalResultCount', 10)