我正在开发一个Asp.net MVC应用程序,并遇到了一个场景,我必须在两列中显示内容(即并排)我用Google搜索并在此处遇到了解决方案。我试过但徒劳无功。 我试过这种方式
@model IEnumerable<MvcApplication1.tblTest>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
<table>
<tr>
<th>
testId
</th>
<th>
testName
</th>
<th>
testDescription
</th>
<th></th>
</tr>
@for (var i = 0; i < Model.Count(); i+=2 )
{
<tr>
<td>
@Model[i].testId
</td>
</tr>
}
</table>
但是我收到了编译错误 - 编译错误
描述:编译服务此请求所需的资源时发生错误。请查看以下特定错误详细信息并相应地修改源代码。
Compiler Error Message: CS0021: Cannot apply indexing with [] to an expression of type
'System.Collections.Generic.IEnumerable<MvcApplication1.tblTest>'
Source Error:
Line 27: <tr>
Line 28: <td>
Line 29: @Model[i].testId
Line 30: </td>
Line 31:
有人可以帮我解决这个问题吗?
答案 0 :(得分:11)
简单地说,您无法索引可枚举的内容。它被设计为按顺序一次吐出一个项目,而不是堆栈中任何位置的特定项目。最简单的解决方案是将其转换为List
:
@{
var tblTestList = Model.ToList();
for (var i = 0; i < tblTestList.Count(); i+=2 )
{
<tr>
<td>
@tblTestList[i].testId
</td>
</tr>
}
}
甚至更简单:
@model List<MvcApplication1.tblTest>
答案 1 :(得分:1)
这是一个foreach循环的好地方
@foreach(var m in Model)
{
<tr>
<td>m.testId</td>
<td>m.testName</td>
<td>m.testDescription</td>
</tr>
}
答案 2 :(得分:1)
IEnumerable本身并不包含所有准备使用的项目,它可能基于稍后可能运行的查询,因此索引器不可用。
但是,有不同的方法可以达到同样的目的。
.ToList()或.ToArray()
您可以使用System.Linq中默认提供的扩展方法将您的IEnumerable转换为List或T []
@Model.ToList()[i].testId
或
@Model.ToArray()[i].testId
这可能需要在每次执行.ToList()或ToArray()
时重新运行整个查询因此,建议在为迭代使用该集合时创建List / Array集合。
由于IEnumerable提供了一个基本的迭代器,因此在基类中使用它们要容易得多。
例如,
protected void MyIterator<T>(IEnumerable<T> items)
{
//Iteration here
}
任何人都可以通过传递Query / List / Array
来调用它MyIterator(from i in AllItems where i == '' select i);
或
MyIterator(new List<T>());
或
MyIterator(new T[]{});
在这些情况下,您可以使用IEnumerable上可用的ElementAt(int)索引器。例如,
protected void MyIterator<T>(IEnumerable<T> items)
{
//Iteration here
T item = items.ElementAt(3);//4th item in the items collection.
}