指數

2015-05-05 35 views
3

(漂亮的新剃刀。以下是嚴重的僞編纂並從我的代碼提取。我可能沒有正確的術語,或者確切地知道哪些部分是核心與自定義代碼。)指數

我想訪問for-loop項目中每個項目的順序/索引。 (即項目#1我可以參考'1'和項目#2我可以參考'2'等)所以我可以使用它排序像這樣(我不在乎如何我明白了,只是我明白了):

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個參數)。

+0

你可以改變模型部分期望,比如說'myWidgetIndexedViewModel',有兩個字段:'myWidgetViewModel model'和'int index'。從主視圖傳遞這將是微不足道的,然後 – Andrei

+0

爲什麼你需要在部分視圖中的索引? – ps2goat

+0

您是否嘗試將public int屬性添加到myWidgetItem定義中,並在調用@ Html.Partial之前將其設置在foreach塊中? –

回答

0

有許多的方式來處理你想什麼:

1:包括你的局部視圖模型屬性:

你將需要修改您的局部視圖模型,無論項目的類型是否具有類型爲int的新屬性WidgetIndex,然後你可以這樣做:

@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而不是局部有更好的表現:

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

看起來更像它: 解決方案1:'錯誤:myWidgetItems不包含索引的定義' 解決方案3:'錯誤:不包含Partial的定義(有一些無效參數)'。 – DaveC426913

+0

我在許多MVC解決方案中使用了許多這些方法。我只複製你的僞代碼,所以讓我試着在解決方案中爲你澄清。 – JasonWilczak

+0

我已經更新了我的解決方案和評論。對於解決方案1,您需要將Index屬性添加到部分視圖模型類中才能使用。解決方案3已經改爲使用ViewData,而不是我以前有過的。 – JasonWilczak

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> 
+0

什麼是myWidgetItemType?我認爲這是一個IList。但是IList想知道它包含什麼樣的項目。 – DaveC426913

+0

@ DaveC426913 - 將鼠標懸停在您的@ foreach循環中的'var'上。就是那種類型。 –

+0

@ DaveC426913 - 如果您真正使用的是名稱字符串,您也可以簡單地使用'Tuple (item.Name,idx ++)',然後在item.cshtml頁面中使用'@model Tuple ',然後使用' item = @ModelItem1,index = @ModelItem2',並且在'@Model.Item1'錨點之後。 –