web-dev-qa-db-fra.com

Obtenir la valeur d'index sur rasoir foreach

Je répète un List<T> dans une boucle rasoir pour chaque rendu, ce qui rend un partiel. Dans la partie partielle, je suis en train de restituer un seul enregistrement pour lequel je souhaite en afficher 4 à la suite. J'ai une classe CSS pour les deux colonnes de fin, donc besoin de déterminer dans le partiel si l'appel est le 1er ou le 4ème enregistrement. Quel est le meilleur moyen d'identifier cela dans ma partie pour sortir le code correct?

Ceci est ma page principale qui contient la boucle:

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

}

Je suppose que je peux créer un int que je peux mettre à jour à chaque passage et que le texte ne pose aucun problème ici, mais que je suis plus préoccupé par le passage de la valeur entière à mon partiel Sauf s'il y a un meilleur moyen.

Voici mon partiel:

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

Je ne sais pas si je vais avoir une journée blonde aujourd'hui et que c'est effroyablement facile, mais je ne peux pas penser à la meilleure façon de transmettre la valeur int. J'espère que quelqu'un pourra vous aider.

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

Plus d'infos sur mon blog post http://jimfrenette.com/2012/11/razor-foreach-loop-with-index/

62
Jim Frenette

Ou vous pouvez simplement faire ceci:

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

Jetez un coup d'œil à cette solution utilisant Linq. Son exemple est similaire en ce sens qu’il avait besoin d’un balisage différent pour chaque troisième élément.

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

Y a-t-il une raison pour laquelle vous n'utilisez pas de sélecteurs CSS pour styliser les premier et dernier éléments au lieu d'essayer de leur attacher une classe personnalisée? Au lieu d'un style basé sur alpha ou oméga, utilisez premier-enfant et dernier-enfant.

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

3
Timothy Strimple

Toutes les réponses ci-dessus nécessitent une logique dans la vue. Les vues doivent être stupides et contenir le moins de logique possible. Pourquoi ne pas créer dans votre modèle de vue des propriétés correspondant à la position dans la liste, par exemple:

public int Position {get; set}

Dans votre générateur de modèle de vue, vous définissez les positions 1 à 4.

MAIS .. il y a même un moyen plus propre. Pourquoi ne pas faire de la classe CSS une propriété de votre modèle de vue? Ainsi, au lieu de l'instruction switch dans votre partiel, vous feriez simplement ceci:

<div class="@Model.GridCSS">

Déplacez l'instruction switch vers votre constructeur de modèle de vue et remplissez-y la classe CSS.

0
Louise Eggleton

Si vous souhaitez compter les références de votre modèle (par exemple: le client a l'adresse comme référence pour pouvoir compter le nombre d'adresses existantes pour un client) dans une boucle foreach à votre vue, par exemple:

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

faire comme codé:

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

et l'utiliser comme ça:

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

ps: n'oubliez pas d'ajouter INCLUDE à cette référence chez DbContext dans, par exemple, votre contrôleur d'action Index, s'il s'agit d'un modèle IEnumerable. 

0
BerBar

IndexOf semble être utile ici.

@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

Très simple:

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