MVC5 视图:在模型中循环时设置并获取索引

Posted

技术标签:

【中文标题】MVC5 视图:在模型中循环时设置并获取索引【英文标题】:MVC5 View: Set up and get an index while looping through the model 【发布时间】:2014-12-31 12:12:38 【问题描述】:

在我看来,我正在尝试设置一个索引,以便我可以将表格的每一行标记为偶数或奇数。我做了很多搜索并找到了一个解决方案,但我找到的解决方案是当模型是 IEnumerable 而我的是 PagedList.IPagedList。

Link to the other solution I found

@foreach (var item in Model.Select((x, i) => new  Data = x, Index = i ))

   <tr @if ((item.index) % 2 == 0) <text> class=”even” </text>  else <text> class=”odd” </text>>

         <td>@html.DisplayFor(modelItem => item.thing)</td>
         <td>@Html.DisplayFor(modelItem => item.thing2)</td>
         <td>@Html.DisplayFor(modelItem => item.thing3)</td>
   </tr>

我在编辑器中收到此错误:

如果不先将 lambda 表达式转换为委托或表达式树类型,则不能将其用作动态分派操作的参数。

如果我运行它会出现这个错误:

“AnonymousType#1”不包含“index”的定义,并且找不到接受“AnonymousType#1”类型的第一个参数的扩展方法“index”(您是否缺少 using 指令或程序集引用? )

有什么想法吗?或者我可以不使用 PagedList.IPagedList 模型吗?

编辑: 修复了一件事 将 for each 中的“索引”重命名为“索引”仍然相同,在编辑器错误中。并且运行错误是说所有这些:

@Html.DisplayFor(modelItem => item.thing)

也需要改变

@Html.DisplayFor(modelItem => item.data.thing)

执行此操作后,它会运行,但我没有在标签中得到 class="even 或 class "odd"。

是否有更简单的整体方法?

【问题讨论】:

你的匿名类型属性是Index,而你正在寻找index。我会先解决这个问题 您正在为您的匿名类型设置一个名为Index 的属性,并尝试使用index 访问它。 修复了索引索引的事情。现在看来我必须将 @Html.DisplayFor(modelItem => item.thing) 更改为此 @Html.DisplayFor(modelItem => item.data.thing)在这种情况下有没有更简单的方法来获取索引? 【参考方案1】:

首先,你拼写了item.index,没有大写I。这解释了您看到的错误。

也就是说,您确实应该使用 for 而不是 foreach,而不仅仅是因为您需要索引。 MVC 中 DisplayFor(modelItem =&gt; item.thing) 的表达式假定 lambda 的右侧依赖于左侧,如果不是这种情况,您可能会遇到问题。

由于所有这些,我认为您需要一个 for 循环。幸运的是 IPagedList 实现了IList&lt;T&gt;,所以这没什么大不了的:

@for (int i = 0; i < Model.Count(); i++)

   <tr @if (i % 2 == 0) <text> class=”even” </text>  else <text> class=”odd” </text>>

         <td>@Html.DisplayFor(model => model[i].thing)</td>
         <td>@Html.DisplayFor(model => model[i].thing2)</td>
         <td>@Html.DisplayFor(model => model[i].thing3)</td>
   </tr>

【讨论】:

以上是关于MVC5 视图:在模型中循环时设置并获取索引的主要内容,如果未能解决你的问题,请参考以下文章

在部分视图 MVC5 之间传递视图模型

codeigniter 将数据从视图传递到模型并检索信息

由于“重复项目”而将空行插入表中

GLSL索引绘图并设置纹理案例

LINQ 和 EF6:创建模型时无法使用上下文

循环视图中的模型对象字段