剃刀循环项目索引

时间:2015-05-05 19:04:49

标签: c# asp.net-mvc razor

(对Razor来说很新。以下是严格伪编码并从我的代码中提取。我可能没有正确的术语,或者确切地知道哪些部分是核心部分与自定义代码。)

我希望能够访问for循环项目中每个项目的顺序/索引。 (即在项目#1中我可以引用'1'而在项目#2中我可以引用'2'等等)所以我可以像这样使用SORT OF(我不在乎如何我得到它,只是 我明白了):

item.cshtml:

@model myWidgetViewModel
<a href="foo" 
    @TrackingHelper.SetInfo(new ClickTrackInfo { 
        item = @Model.Name, 
        index= @Model.idx
    })
>
    @Model.Name
</a>

wrapper.cshtml

@model myWidgetViewModel
@foreach (var item in Model.myWidgetItems)
{
    @Html.Partial(item.View, item)
}

从概念上讲,我正试图这样做:

@model myWidgetViewModel
@{int idx = 0;}
@foreach (var item in Model.myWidgetItems)
{
    @Html.Partial(item.View, item, idx)
    idx++;
}

但当然,这不起作用(@ Html.Partial只接受2个args)。

2 个答案:

答案 0 :(得分:0)

将元组发送到您的部分

var args = new Tuple<myWidgetItemType, int>(item, idx);
@Html.Partial(item.View, args)

然后接受它作为部分中的模型(注意:你在foreach循环中使用var,因此很难说出myWidgetItemType的确切类型)

@model Tuple<myWidgetItemType,int>

在您的确切场景中,它看起来像这样:

wrapper.cshtml

@model myWidgetViewModel
@{
    int idx = 0;
}
@foreach (var item in Model.myWidgetItems)
{
    var args = new Tuple<myWidgetItemType, int>(item, idx++);
    @Html.Partial(item.View, args)
}

item.cshtml

@model Tuple<myWidgetItemType,int>
<a href="foo" 
    @TrackingHelper.SetInfo(new ClickTrackInfo { 
        item = @Model.Item1.Name, 
        index= @Model.Item2
    })
>
@Model.Item1.Name
</a>

答案 1 :(得分:0)

有很多方法可以处理您想要的内容:

1:在部分视图模型中包含属性

您需要修改部分视图模型,无论 item 的类型是什么类型为int的新属性,名为 WidgetIndex ,然后您可以这样做:< / p>

@model myWidgetViewModel
@{int idx = 0;}
@foreach (var item in Model.myWidgetItems)
{
    item.WidgetIndex = idx;
    @Html.Partial(item.View, item)
    idx++;
}

...然后,在你的部分你可以使用它:

<div>@Model.WidgetIndex</div>

2:将其放入视图包(请注意,您可以调用该属性,而不仅仅是 WidgetIndex

@model myWidgetViewModel
@{int idx = 0;}
@foreach (var item in Model.myWidgetItems)
{
    ViewBag.WidgetIndex = idx;
    @Html.Partial(item.View, item)
    idx++;
}

...然后,你可以抓住它:

<div>@ViewBag.WidgetIndex</div>

3:您可以使用ViewData:

@model myWidgetViewModel
@{int idx = 0;}
@foreach (var item in Model.myWidgetItems)
{
    ViewData.Add("WidgetIndex", idx);
    @Html.Partial(item.View, item)
    idx++;
}

部分:

<div>@ViewData["WidgetIndex"]</div>

<强>建议

您可以使用IndexOf方法而不是保留变量(注意,我使用解决方案1中的代码作为示例):

@foreach (var item in Model.myWidgetItems)
{
    item.WidgetIndex = Model.myWidgetItems.IndexOf(item);
    @Html.Partial(item.View, item)
    idx++;
}

您可以使用RenderPartial而不是Partial来获得更好的性能:

@foreach (var item in Model.myWidgetItems)
{
    item.WidgetIndex = Model.myWidgetItems.IndexOf(item);
    @{Html.RenderPartial(item.View, item);}
    idx++;
}
相关问题