2011-01-27 8 views
6

Tengo una página de mvc con una plantilla de pantalla. ¿Cómo obtengo el índice del elemento actual que se muestra en la plantilla de pantalla? produce resultados correctos en los atributos de nombre.Índice del elemento actual en la plantilla de visualización de mvc

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

Quiero ese valor de índice en la plantilla de visualización. ¿Está en el ViewContext en alguna parte?

@ * @ page.cshtml @Model ... @ Contactos es 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> 

en la plantilla de visualización tenemos

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

Respuesta

12

Me temo que hay no es una manera fácil de obtener el índice. Está enterrado dentro del método interno System.Web.Mvc.Html.DefaultDisplayTemplates.CollectionTemplate y no está expuesto. Lo que se podría utilizar es el prefijo de campo:

@ViewData.TemplateInfo.HtmlFieldPrefix 

Otra posibilidad es reemplazar @Html.DisplayFor(x => x.Contacts) con:

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

y luego dentro de la plantilla @ViewBag.Index debe darle el índice actual, pero debo admitir que es un poco feo.

+0

Gracias, voy a analizarlo a cabo del prefijo. – Jim

+2

@Jim, tenga cuidado con el análisis porque podría tener niveles profundos como 'Contactos [5] .Address [7]'. –

+0

Gracias por el consejo, lo tendré en cuenta. Hace diez años hubiera dedicado algunas semanas a escribir el analizador multinivel más flexible y elegante. ¡Hoy tomaré el último número coincidente y lo intentaré! – Jim

0

Dependiendo de por qué necesita el índice, puede haber una manera más fácil.

que estaba haciendo algo similar y quería que el índice sólo para poder contar fácilmente la lista de elementos tales como:

  1. primeros artículos en la lista
  2. segundo elemento de la lista etc.

La solución, tal vez obvia, fue presentar mi plantilla de visualización como un elemento de lista dentro de una lista de pedidos y dejar que el navegador maneje la visualización del índice. Originalmente estaba haciendo esto en una tabla y necesitaba el índice para mostrar en la tabla, pero usar una lista ordenada lo hace mucho más fácil.

Así que mi vista padre tenía la siguiente:

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

Y mi plantilla escribió sobre los elementos de un elemento de la lista usando divs - en cuenta que podría utilizar divs flotantes, o mejor aún pantalla:-estilo en línea para obtener una tabla como efecto

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

Y el css:

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

Extendiendo @ DarinDimitrov de respuesta, que quería presentar una solución completa:

Extensión:

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

Padres vista Marcas:

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

formato de plantilla:

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

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