使用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>
这是Razor的错误吗?如果是这样,有没有办法可以重写这个以避免这个问题?
答案 0 :(得分:66)
这是Razor的错误吗?
绝对不是。运行您的应用程序,它将按预期工作。
这是您正在使用的工具(Visual Studio 2012,ReSharper,...)中的一个错误,它无法识别完全有效的语法并警告您不应该警告的内容。您可以尝试在Microsoft Connect站点上打开一个问题并发出此错误信号(如果尚未完成)。
答案 1 :(得分:23)
由于这仍然似乎正在发生并且令人讨厌我认为我至少会让其他人知道我最终用作“黑客”。我不想忽略这个警告,而宁愿接受一个更具有讽刺意味的语法(是的,有人会说这会破坏性能:))
我使用的解决方法是在最后使用客户端添加。对我来说,定义“整数”常量时发生了这个错误,所以
window.foo = @(Model.Something);
给了我一个很好的旧分号错误。我只是将其更改为:
window.foo = @Model.Something + 0;
(在陈述的问题情况下,您应该只能添加'',所以+''。
我知道客户端上还有另外一个添加内容并且它不优雅,但它确实避免了错误。所以使用它或不使用它,但我更喜欢看到警告/错误。
如果有人知道服务器端的语法解决方法,我更倾向于客户端,所以请添加。
答案 2 :(得分: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>
答案 3 :(得分:3)
这对我有用:
var customer = @Html.Raw(ViewBag.CustomerJSON + ";")
答案 4 :(得分:1)
这是布尔人的解决方法:
var myBool = @(Model.MyBool ? "true;" : "false;")
答案 5 :(得分:1)
这对我有用
@Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON));
答案 6 :(得分:1)
<script type="text/javascript">
$().ready(function(){
var customerName = ('@ViewBag.CustomerName'); // <- wrap in parens
});
</script>
是不是像括在括号中一样简单?通过控制台放置值似乎工作正常,没有任何副作用。
它适用于字符串,但它仍然为非引用值提供错误,但我仍然喜欢这个字符串值。对于数字,您只需使用parseInt('@Model.TotalResultCount', 10)
。