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> }

JS块中断中的C#单行foreach循环,但多行中的相同循环有效

Razor

使用@来表示 Razor 指令的开始。除非您主动离开指令的范围,否则您将停留在"剃刀模式"内。

现在,大多数指令在其语法结构结束时结束。例如,当它之后的部分不再进行有效的变量访问时,@Variable结束。@foreach在开始大括号后结束并切换到"内容模式"。

然而,@:是特殊的,因为它接受后面的任何内容并将其解释为字面内容。它只以换行符结束。

所以再次将其拆分为多行,就相当于这样

@foreach (var Type in Model.ChangeTypes)
{
    @:ChangTypes.push("@Type"); }
    alert(ChangeTypes);
    </script>

我在这里调整了缩进以明确发生了什么:结束script标记之前没有右大括号,因此结束标记仍然是 foreach 内容的一部分 - 但 foreach 正文中没有起始标记,所以这就是语法错误的来源。

带有<text> </text>的解决方案没有这个问题,因为结束text标签告诉 Razor 内容的确切结束位置。因此,它不会将右大括号解释为内容,并且 foreach 循环已正确关闭。