我在我视图中的剃刀foreach循环中迭代List<T>
,这使得部分渲染。在部分我正在渲染一个我希望在我的视图中连续4行的记录。我有两个结束列的css类,因此需要在部分中确定调用是第一个还是第四个记录。在我的部分中输出正确代码的最佳方法是什么?
这是我的主页,其中包含循环:
@foreach (var myItem in Model.Members){
//if i = 1
<div class="grid_20">
<!-- Start Row -->
//is there someway to get in for i = 1 to 4 and pass to partial?
@Html.Partial("nameOfPartial", Model)
//if i = 4 then output below and reset i to 1
<div class="clear"></div>
<!-- End Row -->
</div>
}
我想我可以创建一个int,我可以在每次传递时更新并在这里渲染文本没有问题,但它将整数值传递给我更偏心的部分。除非有更好的方法。
这是我的部分内容:
@{
switch()
case 1:
<text>
<div class="grid_4 alpha">
</text>
break;
case 4:
<text>
<div class="grid_4 omega">
</text>
break;
default:
<text>
<div class="grid_4">
</text>
break;
}
<img src="Content/960-grid/spacer.gif" style="width:130px; height:160px; background-color:#fff; border:10px solid #d3d3d3;" />
<p><a href="member-card.html">@Model.Name</a><br/>
@Model.Job<br/>
@Model.Location</p>
</div>
不确定我今天是否有一个金发碧眼的日子,这很容易,但我想不出传递int值的最佳方式。希望有人可以提供帮助。
答案 0 :(得分:117)
@{int i = 0;}
@foreach(var myItem in Model.Members)
{
<span>@i</span>
i++;
}
答案 1 :(得分:64)
//this gets you both the item (myItem.value) and its index (myItem.i)
@foreach (var myItem in Model.Members.Select((value,i) => new {i, value}))
{
<li>The index is @myItem.i and a value is @myItem.value.Name</li>
}
我的博文上有更多信息 http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/
答案 2 :(得分:6)
或者你可以这样做:
@foreach(var myItem in Model.Members)
{
<span>@Model.Members.IndexOf(myItem)</span>
}
答案 3 :(得分:5)
看看this solution using Linq.他的例子类似,因为他需要为每第3个项目提供不同的标记。
foreach( var myItem in Model.Members.Select(x,i) => new {Member = x, Index = i){
...
}
答案 4 :(得分:3)
您是否有理由不使用CSS选择器设置第一个和最后一个元素的样式,而不是尝试将自定义类附加到它们?不使用基于alpha或omega的样式,而是使用first-child和last-child。
答案 5 :(得分:1)
您还可以使用解构和元组并尝试如下操作:
@foreach (var (index, member) in @Model.Members.Select((member, i) => (i, member)))
{
<div>@index - @member.anyProperty</div>
if(index > 0 && index % 4 == 0) { // display clear div every 4 elements
@: <div class="clear"></div>
}
}
有关更多信息,请查看此link
答案 6 :(得分:0)
IndexOf似乎在这里很有用。
@foreach (myItemClass ts in Model.ItemList.Where(x => x.Type == "something"))
{
int currentIndex = Model.ItemList.IndexOf(ts);
@Html.HiddenFor(x=>Model.ItemList[currentIndex].Type)
...
答案 7 :(得分:0)
非常简单:
@{
int i = 0;
foreach (var item in Model)
{
<tr>
<td>@(i = i + 1)</td>`
</tr>
}
}`
答案 8 :(得分:0)
以上所有答案都需要视图中的逻辑。视图应该是愚蠢的,并且包含尽可能少的逻辑。为什么不在视图模型中创建与列表中的位置相对应的属性,例如:
public int Position {get; set}
在视图模型构建器中,您将位置设置为1到4。
但是..甚至还有更清洁的方法。为什么不使CSS类成为视图模型的属性?因此,您无需执行部分中的switch语句,而是执行以下操作:
<div class="@Model.GridCSS">
将switch语句移至视图模型构建器,并在其中填充CSS类。
答案 9 :(得分:0)
如果您要在模型中的foreach循环中计算模型中的引用(即:客户端以地址作为引用,以便您要为一个客户端计算多少个地址),例如:
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.DtCadastro)
</td>
<td style="width:50%">
@Html.DisplayFor(modelItem => item.DsLembrete)
</td>
<td>
@Html.DisplayFor(modelItem => item.DtLembrete)
</td>
<td>
@{
var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();
}
<button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>
<button class="btn-link associar" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Create/@item.IdLembrete"><i class="fas fa-plus"></i></button>
</td>
<td class="text-right">
<button class="btn-link delete" data-id="@item.IdLembrete" data-path="/Lembretes/Delete/@item.IdLembrete">Excluir</button>
</td>
</tr>
}
按编码执行:
@{ var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();}
并像这样使用它:
<button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>
ps:如果这是IEnumerable模型,请不要忘记在内部的DbContext中将INCLUDE添加到该引用,例如,您的Index操作控制器。
答案 10 :(得分:0)
我更喜欢使用这种扩展方法:
public static class Extensions
{
public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> self)
=> self.Select((item, index) => (item, index));
}
来源:
https://stackoverflow.com/a/39997157/3850405
剃刀:
@using Project.Shared.Helpers
@foreach (var (item, index) in collection.WithIndex())
{
<p>
Name: @item.Name Index: @index
</p>
}