C#JS块中的一行foreach循环中断,但多行中的同一循环工作
在尝试根据ViewModel中的数据填充JavaScript数组时,我注意到了一些奇怪的事情。使用以下代码时,Visual Studio不会显示任何错误: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
<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>