我们已经在我们的应用程序中使用了Spark视图引擎一段时间了。自从Resharper 6发布Razor支持以来,我们已经陷入困境并开始交换。
Spark的一个最好的部分是它在foreach循环中自动生成变量。例如,在循环内部,您可以自动获取索引,最后和第一个变量,这些变量可以让您知道索引,项目是否是第一个项目,以及项目是否分别是最后一个项目。
我的问题如下:有没有办法让foreach为我自动生成这些变量,所以我不必手动完成它?我是否需要创建自己的帮助程序?
答案 0 :(得分:1)
正如BuildStarted建议的那样,我使用Phil Haack的帖子来制定解决方案。
public static HelperResult Each<TItem>(this IEnumerable<TItem> items, Func<EnumeratedItem<TItem>, HelperResult> template)
{
return new HelperResult(writer =>
{
int index = 0;
ICollection<TItem> list = items.ToList();
foreach (var item in list)
{
var result = template(new EnumeratedItem<TItem>(index, index == 0, index == list.Count - 1, item));
index++;
result.WriteTo(writer);
}
});
}
EnumeratedItem类:
public class EnumeratedItem<TModel>
{
public EnumeratedItem(int index, bool isFirst, bool isLast, TModel item)
{
this.Index = index;
this.IsFirst = isFirst;
this.IsLast = isLast;
this.Item = item;
}
public int Index { get; private set; }
public bool IsFirst { get; private set; }
public bool IsLast { get; private set; }
public TModel Item { get; private set; }
}
我被迫将IEnumerable转换为ICollection以获得Count属性。
用法:
@Model.History.Each(
@<text>
<li class="@(@item.IsLast ? "last" : string.Empty)">
@{ var versionNo = Model.History.Count - @item.Index; }
<div class="clearfix version selected">
<div class="index">
<a href="@item.Item.Url">@versionNo</a>
</div>
<div class="modified">
@item.Item.DateModified<br/>
@Html.Raw(item.Item.ModifiedBy)
</div>
<div class="view">
<a href="@item.Item.CompareUrl">View changes</a>
</div>
</div>
</li>
</text>)
答案 1 :(得分:0)
答案 2 :(得分:0)
Phil Haack写了一个很好的例子,它将为您提供您在这里寻找的项目http://haacked.com/archive/2011/04/14/a-better-razor-foreach-loop.aspx
它与foreach
不同,但是如果你想要你正在寻找的功能,你将被要求做类似的事情。
HugoWare还有一篇很棒的IEnumerable
扩展文章,提供了您正在寻找的所有功能http://hugoware.net/blog/build-a-smarter-loop-with-c
我可能会建议使用Hugoware的例子,因为它不仅仅是剃刀。