JS块中断中的C#单行foreach循环,但多行中的相同循环有效
本文关键字:循环 有效 foreach 中断 单行 JS | 更新日期: 2023-09-27 18:32:31
在尝试根据ViewModel中的数据填充JavaScript数组时,我注意到了一些奇怪的东西。当我使用以下代码时,Visual Studio不会显示任何错误:
<script type="text/javascript">
var ChangeTypes = [],
Priorities = [],
ImpactTypes = [],
Users = [];
@foreach (var Type in Model.ChangeTypes)
{
@:ChangTypes.push("@Type");
}
alert(ChangeTypes);
</script>
但是当我使用以下代码时,出现错误:
名称"警报"在当前上下文中不存在">
<script type="text/javascript">
var ChangeTypes = [],
Priorities = [],
ImpactTypes = [],
Users = [];
@foreach (var Type in Model.ChangeTypes) { @:ChangTypes.push("@Type"); }
alert(ChangeTypes);
</script>
从循环的多行版本到破坏 JavaScript 的单行版本是什么?
正如所问,如果我运行项目,我会收到错误
编译所需的资源时出错 处理此请求。请查看以下特定错误 详细信息并适当修改源代码。
/views/ProjectManagement/ITChangeManagement.cshtml
遇到没有匹配开始标记的结束标记"脚本"。是你的 开始/结束标签是否适当平衡?
编辑: 有趣的是,以下代码没有任何问题:
@foreach (var Status in Model.ApprovalStatus) { <text>ApprivalStatus.push("@Status");</text> }
使用@
来表示 Razor 指令的开始。除非您主动离开指令的范围,否则您将停留在"剃刀模式"内。
现在,大多数指令在其语法结构结束时结束。例如,当它之后的部分不再进行有效的变量访问时,@Variable
结束。@foreach
在开始大括号后结束并切换到"内容模式"。
然而,@:
是特殊的,因为它接受后面的任何内容并将其解释为字面内容。它只以换行符结束。
所以再次将其拆分为多行,就相当于这样
@foreach (var Type in Model.ChangeTypes)
{
@:ChangTypes.push("@Type"); }
alert(ChangeTypes);
</script>
我在这里调整了缩进以明确发生了什么:结束script
标记之前没有右大括号,因此结束标记仍然是 foreach 内容的一部分 - 但 foreach 正文中没有起始标记,所以这就是语法错误的来源。
带有<text> </text>
的解决方案没有这个问题,因为结束text
标签告诉 Razor 内容的确切结束位置。因此,它不会将右大括号解释为内容,并且 foreach 循环已正确关闭。