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 和尾随分号的主要内容,如果未能解决你的问题,请参考以下文章