3

我有一个现有的存储过程,当它被调用时,会在一个表格中填充几周的足球赛程。

然后,用户将从下拉列表中对每个夹具进行预测,然后我希望使用模型绑定将所有预测插入在一起。

我从我的角度显示了下面的相关代码,这目前让我很头疼:

@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 帮助行中,我收到以下错误:

查询的结果不能多​​次枚举。

谁能给我一个正确方向的指针?

4

3 回答 3

7

当然,您使用的是IEnumerable,这很好,但您需要了解您正在使用什么。枚举非常适合 for 循环之类的事情。显然,它们被优化为可以枚举,但优化意味着你只能这样做一次

由于枚举实际上并没有“自身长度”的概念(它的构建是为了吐出一个项目直到它用完项目,仅此而已)。它可以使用Count,但它必须计算它,并且是计算成员总数以枚举它们并在它们经过时计算它们的唯一方法。这意味着您刚刚运行了枚举,因此您的 for 循环没有任何用处。

解决此问题的方法是将其转换为不存在此问题的其他类型,例如列表。它不如 enumberable 高效,但您别无选择。

您可以使用执行此操作ToList(),然后将其保存到您将用于计数和 for 循环的 var 中,也可以从一开始就使用类似IList<>ICollection<>代替IEnumerable<>.

于 2013-04-11T20:14:36.353 回答
1

通过调用 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)

...
于 2013-04-11T20:13:18.040 回答
0

当我将项目列表作为 IEnumerable 取回时,我不断收到此错误。我想手动检查是否从数据库返回了正确的信息,因此,当我遇到断点时,我会检查 IEnumerable 的内容。我不知道,在我阅读答案之前,我一直在阻止它在下面再次被枚举,它正在被处理的地方。

于 2014-02-24T15:06:48.973 回答