2012-04-26 15 views
36

Sto iterando un List<T> in un ciclo foreach rasoio nella mia vista che esegue il rendering parziale. Nel parziale sto rendendo un singolo record per il quale voglio avere 4 di fila nella mia vista. Ho una classe css per le due colonne finali quindi è necessario determinare in parziale se la chiamata è il 1 ° o il 4 ° record. Qual è il modo migliore di identificare questo nel mio parziale per emettere il codice corretto?Ottenere valore indice sul rasoio foreach

Questa è la mia pagina principale, che contiene il loop:

@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> 

} 

Immagino che posso creare un int che posso aggiornare su ogni passaggio e rendere il testo non è un problema qui, ma sta passando il valore intero nel mio parziale sono più preoccupato per. A meno che non ci sia un modo migliore.

Qui è la mia parziale:

@{ 
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> 

Non sono sicuro se sto avendo un giorno bionda oggi e questo è spaventosamente facile, ma non riesco proprio a pensare al modo migliore per passare il valore int in. Spero che qualcuno possa aiutarti.

+0

Se solo ci fosse un modo in C# per fare un ciclo con un indice ... oh aspetta! C'è! http://msdn.microsoft.com/en-us/library/ch45axte.aspx :) – bhamlin

+0

La creazione dell'indice non è il problema. Il passaggio dell'indice nel parziale è il problema. – lloydphillips

risposta

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

Ben fatto - semplice e facile da leggere –

+0

concordato. esattamente quello di cui avevo bisogno – richfinelli

+0

@ (i ++) è più compatto :) –

4

Dai uno sguardo allo this solution using Linq. Il suo esempio è simile in quanto aveva bisogno di marcature diverse per ogni terzo articolo.

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

Ma se sto passando il mio membro al parziale, come faccio a ottenere l'indice anche lì? Presumo che dovrei creare un ViewModel separato che incapsula il mio membro per passare al mio parziale. Si sente icky. Mi chiedo solo se potrebbe esserci un modo migliore? – lloydphillips

+0

Ok. Sì, sarebbe un modo o potresti utilizzare l'oggetto anonimo come modello e specificare la dinamica come tipo di modello. C'è un modo per spostare la logica di commutazione nel modello principale in modo che non ci sia bisogno di passare il valore dell'indice? Se lo facessi, la tua soluzione originariamente meno elegante funzionerebbe ancora. – brightgarden

3

C'è una ragione non si sta utilizzando selettori CSS per lo stile del primo e dell'ultimo elementi invece di cercare di collegare una classe personalizzata per loro? Invece di uno stile basato su alfa o omega, usa first-child e last-child.

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

+0

Potrei avere più righe quindi dovrei creare un div di contenuto per avvolgere ogni riga in modo da definire il primo e l'ultimo figlio all'interno di quella riga (che poi mi riconduce a richiedere una variabile int). Vedo quello che stai dicendo, è qualcosa che cercherò di esplorare. – lloydphillips

+0

Solo così siamo chiari, hai più righe e più colonne. Perché questo non è un tavolo? ;) –

+3

Perché i tavoli sono pantaloni. – 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> 
} 

Maggiori informazioni nel mio blog http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

+2

Complimenti per l'utilizzo di LINQ. –

0

IndexOf sembra essere utile qui.

@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

Oppure si potrebbe semplicemente fare questo:

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

molto semplice:

 @{ 
     int i = 0; 
     foreach (var item in Model) 
     { 
      <tr> 
      <td>@(i = i + 1)</td>` 
      </tr> 
     } 
     }` 
Problemi correlati