60

使用 Visual Studio 2012,在 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 中的错误吗?如果是这样,有没有办法我可以重写它来避免这个问题?

4

7 回答 7

67

这是 Razor 中的错误吗?

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

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

于 2012-08-25T06:53:01.180 回答
23

由于这似乎仍在发生并且令人讨厌,我想我至少会让其他人知道我最终将其用作“黑客”。我不想忽略警告,而宁愿接受更古怪的语法(是的,有人会说这会降低性能:))

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

window.foo = @(Model.Something);

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

window.foo = @Model.Something + 0;

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

我知道客户端上发生了另一个完整的添加,它并不优雅,但它确实避免了错误。所以使用它或不使用它,但我更喜欢这个而不是看到警告/错误。

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

于 2013-04-01T17:56:52.770 回答
7

我发现将 Razor 语法包装在 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>
于 2014-11-15T01:23:04.567 回答
3

这对我有用:

var customer = @Html.Raw(ViewBag.CustomerJSON + ";")
于 2014-04-02T14:45:55.607 回答
1

这对我有用

@Html.Raw(string.Format("var customer = {0};", ViewBag.CustomerJSON));
于 2014-08-08T00:28:10.170 回答
1

这是布尔值的解决方法:

var myBool = @(Model.MyBool ? "true;" : "false;")
于 2014-08-07T16:44:04.403 回答
1
<script type="text/javascript">
    $().ready(function(){
        var customerName = ('@ViewBag.CustomerName');  // <- wrap in parens
    });
</script>

不是用括号括起来那么简单吗?通过控制台输入值似乎工作正常,没有副作用。

它适用于字符串,但它仍然会为未引用的值提供错误,但我仍然喜欢字符串值。对于数字,您可以使用parseInt('@Model.TotalResultCount', 10).

于 2015-05-08T12:36:15.203 回答