Я думаю, что прилагаемый пример в значительной степени охватывает все, что вам нужно знать, трекер петель не так таинственен, как вы думаете.
Все, что Loop.OuterLoop
делает, ссылается на родительский цикл, если вы находитесь в нем, и он отслеживается, например:
@{
int[] outerThings = new int[] {1,2,3,4};
var innerThings = new[] {"a","b","c", "d"};
foreach (int outerThing in outerThings.Track())
{
<li>@outerThing
@foreach(var innerThing in innerThings.Track())
{
<li>---->@innerThing
@if (Loop.OuterLoop.First)
{
<strong>Start of outer loop (index is: @Loop.OuterLoop.Index)</strong>
}
@if (Loop.OuterLoop.Last)
{
<strong>end of outer loop (index is: @Loop.OuterLoop.Index)</strong>
}
</li>
}
</li>
}
}
Под капотом помощник просто оборачивает доступ к вашим массивам, спискам и коллекциям и отслеживает движение вперед по этим элементам с возрастающим значением внутреннего индекса.
Обновление:
Вот пример использования трех вложенных циклов с внутренним циклом, ссылающимся на самый внешний цикл (outerThings
):
@{
int[] outerThings = new int[] {1,2,3,4};
var middleThings = new[] { "A", "B", "C", "D" };
var innerThings = new[] { "a", "b", "c", "d" };
foreach (int outerThing in outerThings.Track())
{
<li>@outerThing
@foreach(var middleThing in middleThings.Track())
{
<li>---->@middleThing
@foreach(var innerThing in innerThings.Track())
{
<li>-----+---->@innerThing
@if (Loop.OuterLoop.OuterLoop.First)
{
<strong>
Start of outerThing loop (index is: @Loop.OuterLoop.OuterLoop.Index)
</strong>
}
@if (Loop.OuterLoop.OuterLoop.Last)
{
<strong>
End of outerThing loop (index is: @Loop.OuterLoop.OuterLoop.Index)
</strong>
}
</li>
}
</li>
}
</li>
}
}