Razor/JavaScript 和尾随分号

Posted

技术标签:

【中文标题】Razor/JavaScript 和尾随分号【英文标题】:Razor/JavaScript and trailing semicolon 【发布时间】:2012-08-20 03:43:46 【问题描述】:

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

【问题讨论】:

如果你真的对它不感兴趣.. 就像有些人'提示'.. 你可以做类似@Html.Raw(ViewBag.CustomerJSON) + ''; 的事情,因为 JavaScript 验证器需要整数或文本。它对结果完全没有任何作用,但会删除红色曲线。 Warning: Overusing this might burn your eyes later on. 另一个 hackish 解决方法:var data = [@Json.Encode(someObject)][0]; 适用于返回 JSON 对象而不是字符串或数字的 c# 调用。 我不建议仅仅为了缓解 IDE 问题而为每个 javascript 值创建数组。 【参考方案1】:

这是 Razor 中的错误吗?

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

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

【讨论】:

看起来这里有一个连接错误:connect.microsoft.com/VisualStudio/feedback/details/777108/… 在connect.microsoft.com/VisualStudio/feedback/details/760339/… 上还有另一个更活跃的连接错误 - 不过看起来微软不会在 2012 年修复这个问题 超级烦人的问题也没有在 VS 2013 中修复,我只是赞成连接错误,建议其他人也这样做。 在 VS 2013 Update 2 中仍然是一个活跃的错误。它也在逗号后出现。 EX: prop: @Model.Prop, 将 Razor 对象作为参数传递给 javascript 对象时也会出现问题: foo.bar('something', @JavaScriptConverter.Serialize(pizza));【参考方案2】:

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

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

window.foo = @(Model.Something);

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

window.foo = @Model.Something + 0;

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

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

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

【讨论】:

对于一般情况,您可以简单地这样做:window.foo = [@Model.Something][0] 我将此答案改编为字符串; @Html.Raw(Json.Encode(Model.Where(m => m.Apply)))+"" , @andrewjs 您建议创建一个数组来解决这些 IDE 错误?根本不是一个好习惯。 这不适用于对象。 + 0 适用于数字,+ '' 适用于字符串。如果您使用编码的 JSON,您将得到一个类似 [object Object]0 的字符串,这是错误的。 identity function 想法和其他答案中的 array workaround 对所有数据类型都非常有效。【参考方案3】:

我发现将 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>

【讨论】:

这基本上也是我们内部使用的。我们将函数命名为 Razor(obj) @crush 我像你一样创建了一个 Razor 函数,但是,你为什么不能在值周围加上括号呢? var i = (@ViewBag.value); ? @Nate 这可能行得通。我升级到VS2013,问题已经解决了,所以我不能再测试了。【参考方案4】:

这对我有用:

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

【讨论】:

除非您连续有两个 var 声明,否则此方法有效。然后 Razor 在第二个上吓坏了。【参考方案5】:

以下是布尔值的解决方法:

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

【讨论】:

【参考方案6】:

这对我有用

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

【讨论】:

【参考方案7】:
<script type="text/javascript">
    $().ready(function()
        var customerName = ('@ViewBag.CustomerName');  // <- wrap in parens
    );
</script>

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

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

【讨论】:

对于非字符串,您可以在 razor 调用周围加上括号。例如:const i = (@((int)Enum.SomeValue))

以上是关于Razor/JavaScript 和尾随分号的主要内容,如果未能解决你的问题,请参考以下文章

如何删除前导和尾随空格?

前导和尾随空格剪切 + 中间空格替换

在 SQL Server 的列中删除尾随空格和更新

JavaScript

iOS:对齐两个 UILabel 的前导和尾随

自己。在尾随迅速关闭,意义和目的?