C#JS块中的一行foreach循环中断,但多行中的同一循环工作

C#JS块中的一行foreach循环中断,但多行中的同一循环工作,c#,asp.net,razor,C#,Asp.net,Razor,在尝试根据ViewModel中的数据填充JavaScript数组时,我注意到了一些奇怪的事情。使用以下代码时,Visual Studio不会显示任何错误: <script type="text/javascript"> var ChangeTypes = [], Priorities = [], ImpactTypes = [], Users = []; @foreach (var Type in Model.Cha

在尝试根据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>

var ChangeTypes=[],
优先级=[],
影响类型=[],
用户=[];
@foreach(Model.ChangeTypes中的变量类型)
{
@:ChangTypes.push(“@Type”);
}
警报(变更类型);
但是当我使用下面的代码时,我得到了错误:

当前上下文中不存在名称“警报”


var ChangeTypes=[],
优先级=[],
影响类型=[],
用户=[];
@foreach(Model.ChangeTypes中的变量类型){@:ChangeTypes.push(“@Type”);}
警报(变更类型);
从循环的多行版本转变为打破JavaScript的单行版本有什么意义

正如被问到的,如果我运行这个项目,我会得到错误

编译所需的资源时出错 处理此请求。请查看以下特定错误 详细信息,并适当修改源代码

/视图/ProjectManagement/itchengemanagement.cshtml

遇到的结束标记“script”没有匹配的开始标记。您的 开始/结束标签是否正确平衡

编辑: 非常有趣的是,以下代码没有任何问题:

@foreach (var Status in Model.ApprovalStatus) { <text>ApprivalStatus.push("@Status");</text> }
@foreach(Model.ApprovalStatus中的var状态){appivalstatus.push(“@Status”);}

Razor使用
@
表示Razor指令的开始。除非您主动离开指令的范围,否则您将保持在“Razor模式”内

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

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

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

@foreach (var Type in Model.ChangeTypes)
{
    @:ChangTypes.push("@Type"); }

    alert(ChangeTypes);
    </script>
@foreach(Model.ChangeTypes中的变量类型)
{
@:ChangTypes.push(“@Type”);}
警报(变更类型);
我在这里调整了缩进,以明确发生了什么:在结束
脚本
标记之前没有结束大括号,因此结束标记仍然是foreach内容的一部分,但foreach主体中没有起始标记,因此语法错误就来自于此


使用
的解决方案没有这个问题,因为结束
文本
标记告诉Razor内容的确切结束位置。因此它不会将结束括号解释为内容,并且foreach循环正确关闭。

在每种情况下,输出是什么样子的?例如,浏览器实际看到了什么?@T.J.Crowder。我打赌不会hing坏了。浏览器可以很好地处理这两个问题。只是他的VS给出了错误的警告。(我差点说“他的VS给出了一些BS”)@T.J.Crowder我无法获得HTML输出,因为当我运行网站IIS报告我在帖子中添加的错误时。因此VS的警告不是BS错误,而是一个真正的编译错误。RAZOR有时是一个噩梦。它会做类似这样的奇怪事情,我真的没有很好的解释为什么。你可以尝试使用@{foreach…}相反,这与JavaScript无关。
@foreach (var Type in Model.ChangeTypes)
{
    @:ChangTypes.push("@Type"); }

    alert(ChangeTypes);
    </script>