4

これはかなり不可解です。簡単にするために、.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 の動作が改善されると書かれているのを見たことがあります。ありがとう。

4

3 に答える 3

6

@David-Tanseyごと(この回答から-より詳細な説明については参照してください):

(この質問に合わせて変更)

@Html.EditorFor(c => c.Employees)MVC 規則を使用すると、 のデフォルト テンプレートが選択されますIEnumerable。このテンプレートは MVC フレームワークの一部でありHtml.EditorFor()、列挙内の各項目に対して生成されます。次に、そのテンプレートは、リスト内の各項目に適切なエディター テンプレートを個別に生成します。この場合、それらはすべて Employee のインスタンスであるため、各項目に Employee テンプレートが使用されます。


IEnumerable<Employee>名前付きテンプレートをEmployee使用するときの彼の説明を要約すると、実際には、@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate").

:答えがなく、最初にここでつまずいたので、私は本当にこれに答えただけです。少なくとも今では、誰かがそれを閉じたり、重複した質問票を取得するという困難を経験することなく、答えを見逃す可能性があります。

于 2013-08-02T14:13:29.117 に答える
1

foreachで使用でき@HTML.EditorForます。例については、以下の構文を参照してください。

@foreach(var emp in @Model)
{ 
    @Html.EditorFor(d => emp.EmployeeName)
    @Html.EditorFor(d => emp.Designation)
    <br />
}
于 2015-04-21T04:29:21.903 に答える