2012-04-26 17 views
36

ich in meiner Ansicht, die ein List<T> in einer Rasierklinge foreach-Schleife iteriert, die eine teilweise macht. In der partiellen bin ich rendering einen einzigen Datensatz für den ich 4 in einer Reihe aus meiner Sicht haben möchte. Ich habe eine CSS-Klasse für die beiden Endspalten, also muss im Teil bestimmt werden, ob der Aufruf der 1. oder der 4. Datensatz ist. Was ist der beste Weg, dies in meinem Teil zu identifizieren, um den richtigen Code auszugeben?Erster Indexwert auf gestochen foreach

Dies ist meine Haupt-Seite, die die Schleife enthält:

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

} 

ich ich meine, ein int erstellen können, die ich bei jedem Durchlauf aktualisieren und den Text hier kein Problem machen, aber es ist vorbei den ganzzahligen Wert in meine Teilweise mache ich mir mehr Sorgen. Es sei denn, es gibt einen besseren Weg.

Hier ist mein Teil:

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

nicht sicher, ob ich einen blonden Tag heute habe, und das ist furchtbar einfach, aber ich kann einfach nicht glauben, der besten Weges, in den int-Wert zu übergeben. Hoffe jemand kann helfen.

+0

Wenn es nur eine Möglichkeit in C# ist eine Schleife zu tun mit ein Index ... oh warte! Es gibt! http://msdn.microsoft.com/en-us/library/ch45axte.aspx :) – bhamlin

+0

den Index zu erstellen ist nicht das Problem. Das Problem besteht darin, den Index in das Partielle zu übergeben. – lloydphillips

Antwort

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

Gut gemacht - einfach und leicht zu lesen –

+0

vereinbart. genau das, was ich brauchte – richfinelli

+0

@ (i ++) ist kompakter :) –

4

Werfen Sie einen Blick auf this solution using Linq. Sein Beispiel, dass ähnlich ist er verschiedene Markup für jeden dritten Punkt benötigt.

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

Aber wenn ich mein Mitglied der teilweisen vorbei, wie werde ich dort auch den Index bekommen? Ich würde annehmen, dass ich ein getrenntes ViewModel erstellen müsste, das mein Mitglied einkapselt, um es an meinen Teil zu übergeben. Fühlt sich eklig an. Ich frage mich, ob es einen besseren Weg geben könnte? – lloydphillips

+0

Ok. Ja, das wäre eine Möglichkeit, oder Sie könnten das anonyme Objekt als Modell verwenden und dynamic als Modelltyp angeben. Gibt es eine Möglichkeit, die Switch-Logik in die übergeordnete Vorlage zu verschieben, sodass der Indexwert nicht übergeben werden muss? Wenn Sie dies tun, würde Ihre ursprüngliche, vielleicht weniger elegante Lösung noch funktionieren. – brightgarden

3

Gibt es einen Grund Sie nicht CSS-Selektoren mit den ersten und letzten Elemente stylen anstatt zu versuchen, eine benutzerdefinierte Klasse, um sie zu befestigen? Statt auf Alpha oder Omega zu stylen, verwenden Sie First-Child und Last-Child.

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

+0

Ich könnte mehrere Zeilen haben, also müsste ich ein Inhalts-Div erstellen, um jede Zeile zu umbrechen, um das erste und letzte Kind innerhalb dieser Zeile zu definieren (was mich dann dazu bringen würde, eine int-Variable zu benötigen). Ich sehe was du sagst, aber ich versuche es zu erforschen. – lloydphillips

+0

Nur so sind wir klar, Sie haben mehrere Zeilen und mehrere Spalten. Warum ist das kein Tisch? ;) –

+3

Weil Tische Hosen sind. – 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> 
} 

Mehr Informationen auf meinem Blog-Post http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

+2

Kudos für die Verwendung von LINQ. –

0

IndexOf scheint hier nützlich zu sein.

@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

Oder Sie könnten dies einfach tun:

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

sehr einfach:

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