7
votes

Index de l'élément de courant dans le modèle d'affichage MVC

J'ai une page MVC avec un displaytemplate. Comment puis-je obtenir l'index de l'élément actuel rendu dans la plaque d'affichage. Il produit des résultats obligatoires corrects dans les attributs de noms.

@* contact.cshtml *@
@model ...@* This is the T of the IEnumerable<T> *@

<tr>
   @* I NEED THE INDEX OF THE CURRENT ITERATION HERE *@
   <td>@Html.DisplayFor(x => x.FirstName)</td>
</tr>


0 commentaires

3 Réponses :


13
votes

J'ai peur qu'il n'y ait pas de moyen facile d'obtenir l'index. Il est enterré à l'intérieur du système interne system.web.mvc.html.defaultdisplaytemplates.collectiontemplate code> et non exposé. Ce que vous pouvez utiliser est le préfixe de champ:

@for (int i = 0; i < Model.Contacts.Length; i++)
{
    @Html.DisplayFor(x => x.Contacts[i], new { Index = i })
}


4 commentaires

Merci, je l'analyserai hors du préfixe.


@Jim, soyez prudent avec l'analyse car vous pourriez avoir des niveaux profonds tels que les contacts [5] .Addresses [7] .


Merci pour la pointe, je supporterai cela à l'esprit. Il y a dix ans, j'aurais passé quelques semaines à écrire l'analyseur multi-niveaux le plus flexible et le plus élégant. Aujourd'hui, je vais prendre le dernier numéro correspondant et en avoir!


@Darindimitrov, merci de me diriger vers @ ViewData.Templateinfo.htmlfieldprefix - Je cherchais une solution à cela pendant plusieurs heures. Je suis d'accord avec le sentiment de Jim, une simple solution non élégante fonctionnera pour moi.



2
votes

Selon la raison pour laquelle vous avez besoin de l'index, il peut y avoir un moyen plus facile.

Je faisais quelque chose de similaire et je voulais l'index juste pour pouvoir remplir facilement la liste des éléments tels que: P>

  1. Premiers éléments de la liste LI>
  2. second article dans la liste c. li> OL>

    La solution peut-être évidente consistait à rendre mon modèle d'affichage en tant qu'élément de liste dans une liste de commandes et laissez le navigateur gérer l'affichage de l'index. Je faisais à l'origine cela dans une table et j'avais besoin de l'index à afficher dans la table, mais l'utilisation d'une liste ordonnée facilite beaucoup plus facilement. P>

    Donc, mon point de vue des parents avait les suivants: P>

    .class1 {
        display: inline-block;
        width: 150px;
    }
    


0 commentaires

2
votes

Extension de la réponse de @ Darindimitrov, je voulais soumettre une solution complète:

Etvention: P>

@using ApplicationName.Helpers
@model ApplicationName.Models.ModelName

<span>Item @ViewData.TemplateInfo.GetTemplateIndex()</span>


0 commentaires