Как и предполагал BuildStarted, я использовал пост Фила Хаака, чтобы сформулировать решение.
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>)