2012-04-26 10 views
36

Jestem Ierating List<T> w pętli foreach brzytwa w moim widoku, który renderuje częściowe. W częściowym renderuję pojedynczy rekord, dla którego chcę mieć 4 z rzędu w moim widoku. Mam klasy css dla dwóch kolumn końcowych, więc należy określić w częściowe, czy wywołanie jest 1. lub 4. rekord. Jaki jest najlepszy sposób identyfikowania tego w moim częściowym, aby wyprowadzić poprawny kod?Uzyskiwanie wartości indeksu na foreach brzytwy

To jest moja strona główna, która zawiera pętlę:

@foreach (var myItem in Model.Members){ 

     //if i = 1 
     <div class="grid_20"> 
     <!-- Start Row --> 

     //is there someway to get in for i = 1 to 4 and pass to partial? 
     @Html.Partial("nameOfPartial", Model) 

     //if i = 4 then output below and reset i to 1 
     <div class="clear"></div> 
     <!-- End Row --> 
     </div> 

} 

I rysunek można utworzyć int że mogę zaktualizować na każdym przejściu i renderować tekst nie ma problemu tutaj, ale to przepuszczenie wartość całkowitą do mojego częściowy jestem bardziej zainteresowany. Chyba że jest lepszy sposób.

Oto mój częściowy:

@{ 
switch() 
case 1: 
     <text> 
     <div class="grid_4 alpha"> 
     </text> 
break; 
case 4: 
     <text> 
     <div class="grid_4 omega"> 
     </text> 
break; 
default: 
     <text> 
     <div class="grid_4"> 
     </text> 
break; 
} 

     <img src="Content/960-grid/spacer.gif" style="width:130px; height:160px; background-color:#fff; border:10px solid #d3d3d3;" /> 
     <p><a href="member-card.html">@Model.Name</a><br/> 
     @Model.Job<br/> 
     @Model.Location</p> 
</div> 

Nie wiem, czy mam blondynka dzień dzisiaj i to jest strasznie proste, ale ja po prostu nie mogę myśleć o najlepszy sposób, aby przekazać wartość int w. Mam nadzieję, że ktoś może pomóc.

+0

Gdyby tylko był sposób w C#, aby zrobić pętlę z indeks ... och, czekaj! Jest! http://msdn.microsoft.com/en-us/library/ch45axte.aspx :) – bhamlin

+0

Tworzenie indeksu nie jest problemem. Przekazywanie indeksu do częściowego jest problemem. – lloydphillips

Odpowiedz

88
@{int i = 0;} 
@foreach(var myItem in Model.Members) 
{ 
    <span>@i</span> 
    i++; 
} 
+2

Dobra robota - uzgodniono prosty i łatwy do odczytania –

+0

. dokładnie to, co potrzebne – richfinelli

+0

@ (i ++) jest bardziej kompaktowy :) –

4

Spójrz na this solution using Linq. Jego przykład jest podobny, ponieważ potrzebował różnych znaczników dla każdego trzeciego elementu.

foreach(var myItem in Model.Members.Select(x,i) => new {Member = x, Index = i){ 
    ... 
} 
+0

Ale jeśli przekażę memu posłowi część informacji o tym, w jaki sposób mam tam również uzyskać indeks? Zakładam, że musiałbym stworzyć osobny ViewModel, który hermetyzuje mojego Członka, aby przejść do mojego częściowego. Czuje icky. Zastanawiasz się, czy może być lepszy sposób? – lloydphillips

+0

Ok. Tak, to byłby jeden ze sposobów, lub możesz użyć anonimowego obiektu jako modelu i określić dynamiczny jako typ modelu. Czy istnieje sposób przeniesienia logiki przełączania do szablonu nadrzędnego, aby nie było potrzeby przekazywania wartości indeksu? Gdybyś to zrobił, twoje oryginalne, prawdopodobnie mniej eleganckie rozwiązanie nadal by działało. – brightgarden

3

Czy istnieje powód, dla którego nie używasz selektorów CSS do stylizowania pierwszego i ostatniego elementu zamiast próbować dołączać do nich niestandardową klasę? Zamiast stylizacji opartej na alfy lub omegi, używaj pierwszego dziecka i ostatniego dziecka.

http://www.quirksmode.org/css/firstchild.html

+0

Mogłem mieć wiele wierszy, więc musiałbym utworzyć div zawartości, aby zawijać każdy wiersz, aby zdefiniować pierwsze i ostatnie dziecko w tym wierszu (które następnie doprowadziłoby mnie z powrotem do potrzeby zmiennej int). Widzę, co mówisz, to coś, co spróbuję zbadać. – lloydphillips

+0

Po prostu mamy jasne, masz wiele wierszy i wiele kolumn. Dlaczego to nie jest stół? ;) –

+3

Ponieważ stoły są spodniami. – lloydphillips

56
//this gets you both the item (myItem.value) and its index (myItem.i) 
@foreach (var myItem in Model.Members.Select((value,i) => new {i, value})) 
{ 
    <li>The index is @myItem.i and a value is @myItem.value.Name</li> 
} 

Więcej informacji na moim blogu http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

+2

Kudos za używanie LINQ. –

0

IndexOf wydaje się być tu przydatny.

@foreach (myItemClass ts in Model.ItemList.Where(x => x.Type == "something")) 
    { 
     int currentIndex = Model.ItemList.IndexOf(ts); 
     @Html.HiddenFor(x=>Model.ItemList[currentIndex].Type) 

...

3

Albo może po prostu to zrobić:

@foreach(var myItem in Model.Members) 
{  
    <span>@Model.Members.IndexOf(myItem)</span> 
} 
0

bardzo proste:

 @{ 
     int i = 0; 
     foreach (var item in Model) 
     { 
      <tr> 
      <td>@(i = i + 1)</td>` 
      </tr> 
     } 
     }` 
Powiązane problemy