Razor foreach中类似Spark的语法

时间:2011-07-26 17:14:11

标签: asp.net-mvc-3 razor flex-spark

我们已经在我们的应用程序中使用了Spark视图引擎一段时间了。自从Resharper 6发布Razor支持以来,我们已经陷入困境并开始交换。

Spark的一个最好的部分是它在foreach循环中自动生成变量。例如,在循环内部,您可以自动获取索引,最后和第一个变量,这些变量可以让您知道索引,项目是否是第一个项目,以及项目是否分别是最后一个项目。

我的问题如下:有没有办法让foreach为我自动生成这些变量,所以我不必手动完成它?我是否需要创建自己的帮助程序?

3 个答案:

答案 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)

在Visual Studio 2010中有“代码片段” - 代码部分,它允许生成代码。使用某些实用程序,您可以编辑“foreach”的默认代码段并使用您需要的变量编写自己的代码。

答案 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的例子,因为它不仅仅是剃刀。