我有一个现有的存储过程,当它被调用时,它会用周的足球赛程填充一个表。
然后,用户将从下拉列表中对每个固定装置进行预测,然后我希望使用模型绑定将所有预测插入到一起。
我已经从我的视图中显示了下面的相关代码,这目前让我头疼:
@model IEnumerable<PPLMVCNewOne.Models.sp_getMakeYourPredictions_Result>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(m => m.ElementAt(i).Home_Team)
我想做的是添加一个索引,这样我就可以在操作结果中对绑定进行建模。
在html助手行中,我得到了以下错误:
查询的结果不能枚举多次。
谁能给我一个指向正确方向的指针吗?
您使用的是IEnumerable
,当然这很好,但您需要了解使用的是什么。枚举对于for循环之类的事情非常有用。它们被优化为,很明显,被枚举,但优化意味着你只能做一次。
由于枚举实际上并没有"自身长度"的概念(它是为了吐出一个项,直到它没有项为止,仅此而已(。它可以使用Count
,但它必须计算它,这也是计算成员总数的唯一方法,即枚举它们并在它们经过时对它们进行计数。这意味着你刚刚运行了枚举,所以你的for循环没有什么可用的。
解决这个问题的方法是将它强制转换为其他类型,例如list,这样就不会出现这个问题。它的效率不如枚举器,但你别无选择。
您可以使用ToList()
执行此操作,然后将其保存到将用于计数和for循环的var中,或者从一开始就使用IList<>
或ICollection<>
而不是IEnumerable<>
来强制转换模型。
通过调用ToList((使操作返回IList而不是IEnumerable。
将视图更改为此
@model IList<PPLMVCNewOne.Models.sp_getMakeYourPredictions_Result>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(m => m.ElementAt(i).Home_Team)
...
当我以IEnumerable的形式返回项目列表时,我一直收到这个错误。我想手动检查数据库中是否返回了正确的信息,所以,当我遇到断点时,我会检查IEnumerable的内容。在我不知道的情况下,直到我读到答案,我才阻止它在下面被再次枚举,也就是它被处理的地方。