xxxForとname

EFでICollection型のデータを扱う事にままなるが、表示はともかく入力となるとバインドの点で躓く。標準のモデルバインダーさんがname属性を見てうまくモデルを組み立ててコントローラーのアクションメソッドの引数に渡してくれるらしいのだが、foreachで回して単純にビューヘルパーを使うとname属性がうまくない。慣れないうちはテンプレートだパーシャルビューだとか分割をすると余計手に負えなくなってくる。
ビューヘルパーが出力するname属性は変更できない。@Html.Row(Html.xxxFor(…)).Replace(…)みたいな事をやれば無理矢理変えられそうではある。またEditorForには引数で指定できるオーバーロードがある。ただこれは自作テンプレート内で出力されるname属性の先頭に付くSystem.Web.Mvc.TemplateInfo.HtmlFieldPrefixの書き換えには役立つが、その他の用途を今のところ私は知らない。
で、どうするかというとBeginCollectionItemを使うのがいいでしょう。

NuGetで取ってきてもいいが、普通にソース拾ってきちゃえば良さげ(現時点ではMs-PL)。
ビューヘルパーさんはラムダ式見てModelと同じだったらElementAt(i)とか使ってもいい感じにnameつけてくれるみたい。逆に変数にとってそれを使うとその変数名を付加してくれちゃうので、良いか悪いかはケースバイケース。