我正在重现视图的列表。因此,该模型是IEnumerable的。它在foreach循环中可以很好地获取员工。但是当我在循环中使用此Model时,会给我错误。“无法在此范围内声明名为'Model'的局部变量,因为它将赋予'Model'不同的含义,而该'Model'已在'parent'或'parent'中使用。当前的范围以表示其他内容“。在循环中,当我使用Model以外的其他名称时,效果很好。
查看@model IEnumerable
@foreach (tbEmployee emp in Model)
{
<tr>
<td>
@Html.DisplayFor(Model => emp.empID)
</td>
<td>
@Html.DisplayFor(Model => emp.empName)
</td>
<td>
@Html.DisplayFor(Model => emp.empAge)
</td>
<td>
@Html.DisplayFor(Model => emp.empStatus)
</td>
<td>
@Html.ActionLink("Edit", "Edit", "Employee")
@Html.ActionLink("Update", "Update", "Employee")
@Html.ActionLink("Delete", "Delete", "Employee")
</td>
</tr>
}
但是当我这样写时,它可以正常工作
@foreach (tbEmployee emp in Model)
{
<tr>
<td>
@Html.DisplayFor(x => emp.empID) //where this x get data from
</td>
<td>
@Html.DisplayFor(x => emp.empName)
</td>
<td>
@Html.DisplayFor(x => emp.empAge)
</td>
<td>
@Html.DisplayFor(x => emp.empStatus)
</td>
<td>
@Html.ActionLink("Edit", "Edit", "Employee")
@Html.ActionLink("Update", "Update", "Employee")
@Html.ActionLink("Delete", "Delete", "Employee")
</td>
</tr>
}
首先,此错误消息已在较新的C#版本中删除;设计团队决定,它造成的混乱比阻止错误要多。
问题在于,名称Model
在这里用来表示两件事:将任何属性或变量用作foreach
的集合,以及用作lambda的形式参数。此外,这两种用法overlap。也就是说,在Model
中使用的foreach
是[[直接在外部在Model
内部的foreach
的用法。基本上,这里的编译器说的是“您正在创建一种可能使用相同名称来表示彼此相邻的两个完全不同的事物的情况”,这是一个非常容易混淆且容易出错的情况。
您已经发现,正确的解决方法是
停止使用相同的名称表示同一范围内的两个完全不同的事物。