webentwicklung-frage-antwort-db.com.de

Indexwert für Rasierer foreach ermitteln

Ich iteriere einen List<T> in einer foreach-Schleife aus meiner Sicht, die einen partiellen Eindruck macht. In dem Teil rendere ich einen einzelnen Datensatz, für den ich 4 in einer Reihe in meiner Ansicht haben möchte. Ich habe eine CSS-Klasse für die beiden Endspalten, muss also im Teil feststellen, ob der Aufruf der 1. oder der 4. Datensatz ist. Was ist der beste Weg, um dies in meinem Teil zu identifizieren, um den richtigen Code auszugeben?

Dies ist meine Hauptseite, 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 schätze, ich kann ein int erstellen, das ich bei jedem Durchlauf aktualisieren und den Text hier ohne Probleme darstellen kann. Es ist jedoch die Übergabe des ganzzahligen Werts an meinen Teil, über den ich mehr besorgt bin. 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>

Ich bin mir nicht sicher, ob ich heute einen blonden Tag habe und das ist furchtbar einfach, aber ich kann mir einfach nicht den besten Weg vorstellen, den int-Wert zu übergeben. Ich hoffe, jemand kann helfen.

45
lloydphillips
 @{int i = 0;}
 @foreach(var myItem in Model.Members)
 {
     <span>@i</span>
     i++;
 }
106
noamtcohen
//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 Infos in meinem Blog-Beitrag http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

62
Jim Frenette

Oder Sie könnten das einfach tun:

@foreach(var myItem in Model.Members)
{    
    <span>@Model.Members.IndexOf(myItem)</span>
}
6
Manoj De Mel

Schauen Sie sich diese Lösung mit Linq an. Sein Beispiel ist insofern ähnlich, als er für jeden 3. Artikel eine andere Auszeichnung benötigte.

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

Gibt es einen Grund, warum Sie keine CSS-Selektoren verwenden, um das erste und das letzte Element zu formatieren, anstatt zu versuchen, eine benutzerdefinierte Klasse anzufügen? Verwenden Sie anstelle des Alpha- oder Omega-Stylings First-Child und Last-Child.

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

3

Alle obigen Antworten erfordern Logik in der Ansicht. Ansichten sollten dumm sein und so wenig Logik wie möglich enthalten. Warum erstellen Sie nicht Eigenschaften in Ihrem Ansichtsmodell, die der Position in der Liste entsprechen, zB:

public int Position {get; set}

In Ihrem View Model Builder legen Sie die Position 1 bis 4 fest.

ABER .. es gibt sogar einen saubereren Weg. Warum machen Sie die CSS-Klasse nicht zu einer Eigenschaft Ihres Ansichtsmodells? Anstelle der switch-Anweisung in Ihrem Teil würden Sie also Folgendes tun:

<div class="@Model.GridCSS">

Verschieben Sie die switch-Anweisung in den Builder für Ansichtsmodell und füllen Sie die CSS-Klasse dort auf.

0
Louise Eggleton

Für den Fall, dass Sie die Referenzen aus Ihrem Modell zählen möchten (z. B.: Der Kunde hat die Adresse als Referenz, so dass Sie zählen möchten, wie viele Adressen für einen Client existieren würden) in einer foreach-Schleife in Ihrer Ansicht, z.

 @foreach (var item in Model)
                        {
                            <tr>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DtCadastro)
                                </td>

                                <td style="width:50%">
                                    @Html.DisplayFor(modelItem => item.DsLembrete)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.DtLembrete)
                                </td>
                                <td>
                                    @{ 
                                        var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();
                                    }
                                    <button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>
                                    <button class="btn-link associar" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Create/@item.IdLembrete"><i class="fas fa-plus"></i></button>
                                </td>
                                <td class="text-right">
                                    <button class="btn-link delete" data-id="@item.IdLembrete" data-path="/Lembretes/Delete/@item.IdLembrete">Excluir</button>
                                </td>
                            </tr>
                        }

tun wie verschlüsselt:

@{ var contador = item.LembreteEnvolvido.Where(w => w.IdLembrete == item.IdLembrete).Count();}

und benutze es so:

<button class="btn-link associado" data-id="@item.IdLembrete" data-path="/LembreteEnvolvido/Index/@item.IdLembrete"><i class="fas fa-search"></i> @contador</button>

ps: Vergessen Sie nicht, INCLUDE zu dieser Referenz in Ihrem DbContext-Objekt hinzuzufügen, z. B. Ihrem Index-Aktionscontroller, falls dies ein IEnumerable-Modell ist. 

0
BerBar

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)

...

0
user2464265

Sehr einfach:

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