(对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)。
答案 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++;
}