我刚刚了解了Nuget包Loop Helper for WebMatrix。不幸的是,我似乎无法找到任何文档或项目网站。有没有人知道如何使用这个或项目网站的位置?
答案 0 :(得分:1)
我认为提供的示例几乎涵盖了您需要知道的所有内容,循环跟踪器并不像您想象的那样神秘。
所有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>
}
}
在bonnet下,帮助程序只是对数组,列表和集合进行包装访问,并使用递增的内部索引值跟踪这些项目的向前移动。
<强>更新强>
这是一个使用三个嵌套循环的示例,其中内部循环引用最外层循环(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>
}
}
答案 1 :(得分:1)
跟踪OuterLoop并不是一件难事。帮助程序将其状态存储在Context.Items中,以确保请求级别的隔离。每次跟踪新循环时,它都会检查Context.Items中是否已存在值,并将其作为OuterLoop属性分配给新循环。当枚举器被释放时,Context.Items中的值被设置为OuterLoop,有效地弹出当前循环。
foo.Track()
fooWrapper.OuterLoop = Content.Items["Loop"] // null at this point.
Context.Items["Loop"] = fooWrapper
bar.Track()
barWrapper.OuterLoop = Content.Items["Loop"] // fooWrapper
Context.Items["Loop"] = barWrapper
bar.Dispose()
Context.Items["Loop"] = barWrapper.OuterLoop // Current in fooWraper
这意味着您可以拥有任何深度的循环,包括跨越页面的循环,它仍然有效。
请注意,帮助程序在多线程方案中不起作用,如果您未能处置枚举器,则可能无法正常工作。