2012-01-24 16 views
1
<ul> 
    @{int i=0;} 
    @foreach (var entry in Model.PhoneNumberEntries) 
    { 
     <li> 
      <span>@entry.PhoneNumber<span> 
      @Html.TextBoxFor(m=>Model.PhoneNumberEntries[i].PhoneNumber)</li> 
     i++; 
    } 
    </ul> 

これは私にとって少し冗長すぎるようです...標準のループに頼らざるを得ずにカウンタを作成する方法はありますか?このhtml/razorコードを書く簡単な方法はありますか?

+0

ループの何が問題なのですか? – jrummell

+0

@jrummell、それらはビューに属しません。 Foreachループは、コントローラ、モデル、...に属します。ビューは、データのみを表示するために使用されます。データのコレクションを表示する必要がある場合は、単にエディタ/ディスプレイテンプレートを使用します。 –

答えて

6

これは私にとって少し冗長すぎるようです... ループの標準に頼らざるを得ずにカウンタを作成する方法はありますか?

ええ、あまりにも冗長すぎるようです。エディタテンプレートを使用している場合は、ループが必要ないため、ループも冗長すぎるようです。

<ul> 
    @Html.EditorFor(x => x.PhoneNumberEntries) 
</ul> 

、その後明らかにあなたは、自動的にPhoneNumberEntriesコレクションの各要素に対してレンダリングされるカスタムエディタのテンプレート(~/Views/Shared/EditorTemplates/PhoneNumberEntry.cshtml)定義します

@model PhoneNumberEntry 
<li> 
    <span>@Model.PhoneNumber</span> 
    @Html.EditorFor(m => m.PhoneNumber) 
</li> 

あなたものようにループを記述する必要はありませんがテンプレートは慣例に従って動作します。

エディタテンプレートの名前と場所が重要であることに注意してください。アプリケーションの異なるコントローラに属するビュー間でこのテンプレートを共有する場合は、~/Views/Shared/EditorTemplatesの中に配置する必要があります。このテンプレートは、ASP.NET MVCが最初に探す場所です。または、~/Views/XXX/EditorTemplatesの中に入れることもできます。XXXは、現在のコントローラの名前です。次に、エディターテンプレートの名前は、コレクションプロパティーのためのアジャストとして使用されるタイプの名前でなければなりません。あなたは何もあなたのメインビューモデルを持っていない場合

ので:

public IEnumerable<FooBarViewModel> FooBars { get; set; } 

対応するテンプレートの名前はFooBarViewModel.cshtmlになり、明らかそれが強くFooBarViewModelに型付けされます。

+0

ダーリン - これは思考のための素晴らしい食糧 - 私はあなたがここに行くところを見ると思う。どうもありがとう。 –

2

これを試してみてください:

<ul> 
@for (int i=0; i++; i < Model.PhoneNumberEntries.Count) 
{ 
    <li>@Html.TextBoxFor(m=>Model.PhoneNumberEntries[i].PhoneNumber)</li> 
} 
</ul> 
+0

'Model.PhoneNumberEntries'が' IEnumerable 'の場合はどうなりますか? –

+0

彼は彼の例で 'Model.PhoneNumberEntries [i]'を使っていたので、 'IEnumerable'のようには見えません。 –

+0

正解、申し訳ありませんが、私はこれに注意を払っていませんでした。 –

関連する問題