Индекс текущего элемента в шаблоне отображения MVC - PullRequest
6 голосов
/ 27 января 2011

У меня есть страница MVC с отображением шаблона. Как мне получить индекс текущего элемента, отображаемого в шаблоне дисплея. это дает правильные привязываемые результаты в атрибутах имени.

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

Я хочу это значение индекса в шаблоне отображения. Это где-то во ViewContext?

@ * page.cshtml @ @model ... @ свойство Contacts является 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>

в шаблоне отображения у нас есть

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

Ответы [ 3 ]

13 голосов
/ 27 января 2011

Боюсь, что нет простого способа получить индекс. Он похоронен внутри внутреннего метода System.Web.Mvc.Html.DefaultDisplayTemplates.CollectionTemplate и не выставлен. Вы можете использовать префикс поля:

@ViewData.TemplateInfo.HtmlFieldPrefix

Другая возможность - заменить @Html.DisplayFor(x => x.Contacts) на:

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

и затем внутри шаблона @ViewBag.Index должен дать вам текущий индекс, но я должен признать, что это довольно уродливо.

2 голосов
/ 11 декабря 2014

Расширяя ответ @ DarinDimitrov, я хотел представить полное решение:

Удлинитель:

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

Разметка родительского представления:

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

Разметка шаблона:

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

<span>Item @ViewData.TemplateInfo.GetTemplateIndex()</span>
1 голос
/ 18 сентября 2014

В зависимости от того, зачем вам нужен индекс, может быть более простой способ.

Я делал что-то похожее и хотел индекс только для того, чтобы я мог легко нумеровать список пунктов, таких как:

  1. Первые элементы в списке
  2. Второй пункт в списке и т.д.

Возможно, очевидное решение состояло в том, чтобы отобразить мой шаблон отображения в качестве элемента списка в списке заказов и позволить браузеру обрабатывать отображение индекса. Первоначально я делал это в таблице, и мне нужно было, чтобы индекс отображался в таблице, но использование упорядоченного списка делает его намного проще.

Итак, у моего родительского представления было следующее:

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

И мой шаблон писал на элементах в элементе списка, используя divs - обратите внимание, что вы можете использовать плавающие div, или, что еще лучше, отобразить: inline-style, чтобы получить эффект таблицы

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

и css:

.class1 {
    display: inline-block;
    width: 150px;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...