2011-01-27 6 views
6

私はdisplaytemplateを持つmvcページを持っています。 displaytemplateでレンダリングされている現在のアイテムのインデックスを取得する方法を教えてください。 名前属性に正しいバインド可能な結果が生成されます。mvcの現在のアイテムのインデックス表示テンプレート

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

私はディスプレイテンプレートでそのインデックス値を使用します。どこかViewContextにありますか? * page.cshtml @ @model ... @財産コンタクト@

は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 [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> 

答えて

12

を持って、私はそこにあるかと思いますインデックスを取得する簡単な方法はありません。内部のSystem.Web.Mvc.Html.DefaultDisplayTemplates.CollectionTemplateメソッドの内部に埋め込まれていますが、公開されていません。あなたが使用することができ、フィールドの接頭辞である:

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

して、テンプレート内@ViewBag.Indexはあなたの現在のインデックスを与える必要がありますが、私はそれはちょっと醜いです認めなければならない:

@ViewData.TemplateInfo.HtmlFieldPrefix 

もう一つの可能​​性で@Html.DisplayFor(x => x.Contacts)を交換です。

+0

おかげで、私はそれを解析します接頭辞の – Jim

+2

@Jim、 'Contacts [5] .Addresses [7]'のような深いレベルがあるかもしれないので、解析には注意してください。 –

+0

チップをありがとう、私は頭に浮かぶだろう。 10年前、私は最も柔軟でエレガントなマルチレベルパーサを書くのに数週間を費やしていたでしょう。今日私は最後に一致する数を取ってそれを持っていきます! – Jim

0

なぜインデックスが必要なのかによって、より簡単な方法があります。

私は似た何かを、ちょうどので、私は簡単のような項目のリスト番号を付けることができ、インデックスを望んでいました。

  1. 一覧 でリストの最初の項目
  2. 2番目の項目など

おそらく明白な解決策は、表示テンプレートをオーダーリスト内のリストアイテムとしてレンダリングし、ブラウザーにインデックスの表示を処理させることでした。私はもともとテーブルでこれをやっていたので、テーブルに表示するためにインデックスが必要でしたが、順序付きリストを使用するとずっと簡単になりました。

だから私の親ビューには、次のように持っていた:

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

そして、私のテンプレートはdivを使用して、リスト項目内の項目に書いた - あなたは浮動divを、またはいっその表示使用することができます注意:取得するには、インラインスタイルを効果

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

のようなテーブルとCSS:

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

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> 
関連する問題