mvc显示模板中当前项的索引

时间:2011-01-27 08:53:09

标签: controls asp.net-mvc-3 indexing ienumerable

我有一个带有displaytemplate的mvc页面。 如何获取在displaytemplate中呈现的当前项的索引。 它在名称属性中生成正确的可绑定结果。

<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 个答案:

答案 0 :(得分:13)

恐怕没有简单的方法来获取索引。它隐藏在内部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内部应该给你当前的索引,但我必须承认它有点难看。

答案 1 :(得分:2)

扩展@ DarinDimitrov的答案,我想提交一个完整的解决方案:

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

父视图标记:

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

模板标记:

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

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

答案 2 :(得分:1)

根据您需要索引的原因,可能有一种更简单的方法。

我正在做类似的事情,并且想要索引,所以我可以轻松编号项目列表,如:

  1. 列表中的第一项
  2. 列表中的第二项 等
  3. 可能显而易见的解决方案是将我的显示模板呈现为订单列表中的列表项,并让浏览器处理索引的显示。我最初是在一个表中执行此操作,并且需要在表中显示索引,但使用有序列表会使其更容易。

    所以我的父视图有以下内容:

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