これはかなり不可解です。簡単にするために、.Employees 列挙可能なプロパティを持つ Company エンティティを想像してください。SO の他の場所で、EditorTemplates で列挙型を適切にレンダリングするための秘訣は、次のような構文を使用することであると見てきました。
Index.cshtml で:
@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate")
EmployeeEditorTemplate.cshtml は、単一の従業員を想定しています。
@model MyNamespace.Models.Employee
//...
@Html.EditorFor(x => x.FullName)
// ...etc.
次のような投稿: Viewmodels List Is Null in Action ... modelbinder がその場でバインドを把握し、列挙可能なインデックスを作成するのに十分なほどスマートであることを示します。私は異なる結果を得ています(モデルバインダーがそれほど魔術的であるはずがなかった場合に私が期待するものとまったく同じです):
The model item passed into the dictionary is of type
System.Collections.Generic.List`1[MyNamespace.Models.Employee]',
but this dictionary requires a model item of type
'MyNamespace.Models.Employee'.
それを自分で列挙すると、コレクションは問題なくレンダリングされますが、すべての行のコントロールに対して同じ id が出力されます (もちろん、これは最適とは言えませんが、EditorTemplate が機能的に正しいことを示しています)。
@foreach (var item in Model.Employees)
{
@Html.EditorFor(x => item, "EmployeeEditorTemplate")
}
このコンストラクトは、company.Employees コレクションを他のコントローラー アクションにポストすることにも失敗します。
以下を達成するために何が必要かについてのアイデアはありますか?
- リスト内のインスタンスごとに一意の ID を持つ子コレクションをレンダリングします
- モデルを使用して子コレクションをポストバックします
自分で列挙する必要があるかどうかも、EditorTemplate の内側にあるか外側にあるかも気にしません。これは不要であり、MVC に処理を任せると MVC の動作が改善されると書かれているのを見たことがあります。ありがとう。