2011-01-27 15 views
6

Mam stronę mvc z tablicą informacyjną. Jak uzyskać indeks bieżącego elementu, który jest renderowany w szablonie odpowiedzi. tworzy poprawne wyniki wiążące w atrybutach nazwy.Indeks bieżącego elementu w szablonie wyświetlania mvc

<input name="xxx[0].FirstName"/> 
<input name="xxx[1].FirstName"/> 

Chcę, aby ta wartość indeksu w szablonie wyświetlania. Czy to gdzieś jest w ViewContext?

@ * page.cshtml @ @model ... @ własności Kontaktów jest IEnumerable * @

<table id="contacts" class="editable"> 
    <thead> 
    <tr><th>Name</th><th>Surname</th><th>Contact Details</th></tr> 
    </thead> 

    <tbody> 
    @Html.DisplayFor(x => x.Contacts) 
    </tbody> 

w szablonie wyświetlacza mamy

@* contact.cshtml *@ 
@model [email protected]* 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> 

Odpowiedz

12

obawiam istnieje nie ma łatwego sposobu na uzyskanie indeksu. Jest pochowany wewnątrz wewnętrznej metody System.Web.Mvc.Html.DefaultDisplayTemplates.CollectionTemplate i nie jest odsłonięty. Co można użyć to przedrostek pola:

@ViewData.TemplateInfo.HtmlFieldPrefix 

Inną możliwością jest zastąpienie @Html.DisplayFor(x => x.Contacts) z:

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

a następnie wewnątrz szablonu @ViewBag.Index powinno dać bieżący indeks, ale muszę przyznać, że to trochę brzydki.

+0

Dzięki, będę analizować go przedrostka. – Jim

+2

@ Jim, należy zachować ostrożność podczas analizowania, ponieważ możesz mieć głębokie poziomy, takie jak 'Kontakty [5] .Addresses [7]'. –

+0

Dzięki za cynk, będę o tym pamiętać. Dziesięć lat temu spędziłbym kilka tygodni na pisaniu najbardziej elastycznego i eleganckiego parsera wielopoziomowego. Dzisiaj wezmę ostatni pasujący numer i mam na nim! – Jim

0

W zależności od tego, dlaczego indeks jest potrzebny, może być łatwiejszy sposób.

robiłem coś podobnego i chciał indeks tylko tak mogłem zliczyć listę elementów, takich jak:

  1. pierwsze pozycje na liście
  2. Druga pozycja w liście itp

Być może oczywistym rozwiązaniem było wyrenderowanie mojego szablonu wyświetlania jako elementu listy na liście zamówień i umożliwienie przeglądarce obsługi wyświetlania indeksu. Pierwotnie robiłem to w tabeli i potrzebowałem indeksu do wyświetlenia w tabeli, ale użycie uporządkowanej listy znacznie ułatwia.

Więc moim zdaniem rodzic miał następujące:

<ol> 
    @Html.DisplayFor(m => m.Items) 
</ol> 

A mój szablon napisał na pozycji w pozycji listy za pomocą DIV - zauważyć można użyć pływających div, albo jeszcze lepiej display: inline-stylu, aby uzyskać stół jak efekt

<li> 
    <div class="class1">@Html.DisplayFor(m => m.ItemType)</div> 
    ... 
</li> 

A css:

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

Wydłużenie @ DarinDimitrov użytkownika odpowiedź, chciałem przedstawić kompletne rozwiązania:

Extention:

namespace ApplicationName.Helpers 
{ 
    public static class RazorHtmlHelpers 
    { 
     public static Int32 GetTemplateIndex(this TemplateInfo template) 
     { 
      var index = 0; 

      var match = Regex.Match(template.HtmlFieldPrefix, @"\d"); 
      Int32.TryParse(match.Value, out index); 

      return index; 
     } 
    } 
} 

nadrzędna Zobacz znaczników:

@Html.DisplayFor(model => model.Items) 

Szablon Markup:

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

<span>Item @ViewData.TemplateInfo.GetTemplateIndex()</span> 
Powiązane problemy