Razor/JavaScript和追踪分号

问题描述:

使用Visual Studio 2012,在Razor视图页面的JavaScript部分,我得到了我认为是Razor语法与JavaScript语法之间的争斗。特别是,在脚本部分的尾随分号通过智能感知标记和编译器警告(不是错误)交付:Razor/JavaScript和追踪分号

“警告13语法错误”。

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

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

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

+1

如果你真的肛门关于它..像一些人的提示'..你可以做一些像'@ Html.Raw(ViewBag.CustomerJSON)+'';'因为JavaScript验证器期待整数或文本。它对结果完全没有影响,但消除了红色的波浪曲线。警告:过度使用可能会在以后灼伤你的眼睛。 – ppumkin

+4

另一个骇人的解决方法:'var data = [@ Json.Encode(someObject)] [0];'适用于返回JSON对象的c#调用,而不是字符串或数字。 – Drewmate

+0

我不会建议为每个javascript值创建数组,只是为了缓解IDE问题。 – crush

这是Razor中的错误吗?

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

它是在工具使用的是(视觉 工作室  2012,ReSharper的,...)都不能确认完全有效的语法和警告你的东西,你不应该被警告的错误。您可以尝试在Microsoft Connect站点上打开一个问题,并发出此错误信号(如果尚未完成)。

+0

很好的回答! :) –

+2

:(Resharper bug? – felickz

+0

看起来像这里有一个连接错误:https://connect.microsoft.com/VisualStudio/feedback/details/777108/syntax-parse-error-on-javascript-asp- net-razor-view –

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

我用作解决方法是在客户端添加结束。对我来说,在定义“整数”不断发生这个错误,所以

window.foo = @(Model.Something); 

给我好老分号错误。我只是把它改为:

window.foo = @Model.Something + 0; 

(在说的问题情况下,你就应该能够加入“”,所以+“”

我知道有一个整体另外除了在客户端上发生的事情。它不是优雅的,但它确实避免了错误,所以使用它或不使用,但我更喜欢看到警告/错误。

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

+7

的一般情况下,你可以简单地做:window.foo = [@ Model.Something] [0] – andrewjs

+0

我适应这个答案的字符串; @ Html.Raw(Json.Encode(Model.Where(m => m.Apply)))+“”, – Darren

+0

@andrewjs你推荐创建一个数组来解决这些IDE错误?根本不是一个好习惯。 – crush

这对我有效:

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

这可以工作,除非你在一行中有两个'var'声明。然后剃刀在第二个怪胎上出现。 – Paul

下面是布尔一种解决方法:

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

这为我工作

@Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON)); 

我发现,包裹在JavaScript身份功能的剃刀语法也使得IDE高兴。

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

这基本上是我们在内部进行的。尽管我们命名了函数'Razor(obj)'。 – crush

+0

@crush我创建了一个Razor函数,但是,为什么你不能只将值放在边上? 'var i =(@ ViewBag.value);'? – Nate

+0

@Nate可能有效。我升级到了VS2013,问题无论如何都是固定的,所以我无法再测试它了。 – crush

<script type="text/javascript"> 
    $().ready(function(){ 
     var customerName = ('@ViewBag.CustomerName'); // <- wrap in parens 
    }); 
</script> 

是不是很简单的在括号包装?通过控制台输入值似乎可以正常工作,没有副作用。

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