剃刀/ JavaScript和尾随分号

tel*_*all 59 javascript asp.net-mvc razor

使用Visual Studio 2012,在Razor视图页面的JavaScript部分中,我得到的是我认为Razor语法与JavaScript语法之间的争斗.特别是,脚本部分中的尾随分号由intellisense标记,并传递编译器警告(而不是错误):

'警告13语法错误'.

如果我删除它,那么我得到一个语句终止建议(在这种情况下是ReSharper,但只是一个好习惯).

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

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

Dar*_*rov 66

这是Razor的一个错误吗?

绝对不.运行您的应用程序,它将按预期工作.

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

  • 在VS 2013中没有修复的超级烦人,我只是赞成连接bug,建议别人也这样做. (7认同)
  • 在http://connect.microsoft.com/VisualStudio/feedback/details/760339/valid-javascript-razor-syntax-marked-as-syntax-error有另一个更活跃的连接错误 - 看起来不像微软虽然会在2012年解决这个问题 (3认同)
  • :( Resharper bug? (2认同)

Mir*_*rko 23

由于这似乎仍然在发生,这是一件令人讨厌的事情,我想我至少会让其他人知道我最终用作"黑客".我不想忽略这个警告而宁愿接受一个更具有讽刺意味的语法(是的,有人会说这会杀死性能:))

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

window.foo = @(Model.Something);
Run Code Online (Sandbox Code Playgroud)

给了我一个很好的旧分号错误.我只是将其改为:

window.foo = @Model.Something + 0;
Run Code Online (Sandbox Code Playgroud)

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

我知道在客户端上发生了另外一个额外的添加并且它不优雅,但它确实避免了错误.所以使用它或不使用它,但我更喜欢看到警告/错误.

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

  • 对于一般情况,你可以简单地做:window.foo = [@ Model.Something] [0] (8认同)

小智 7

我发现在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>
Run Code Online (Sandbox Code Playgroud)