编辑器在没有@foreach的情况下不渲染可枚举

Pau*_*ith 3 asp.net-mvc mvc-editor-templates razor asp.net-mvc-4

这是令人费解的.为简单起见,想象一下具有.Employees可枚举属性的Company实体.我已经在其他地方看到,使EditorTemplates能够合理地呈现可枚举的技巧是使用这样的语法:

在Index.cshtml中:

@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate") 
Run Code Online (Sandbox Code Playgroud)

EmployeeEditorTemplate.cshtml需要一名员工:

@model MyNamespace.Models.Employee
//...
@Html.EditorFor(x => x.FullName)
// ...etc.
Run Code Online (Sandbox Code Playgroud)

像这样的帖子:Viewmodels列表在行动中是空的 ...表明模型绑定器足够聪明,可以找出绑定并动态索引可枚举.我得到了不同的结果(正如我所期望的那样,如果模型绑定器不应该是如此mageriffic):

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'.
Run Code Online (Sandbox Code Playgroud)

自己枚举它会使集合很好,但是为每一行的控件发出相同的id(当然,这不是最佳的,但它告诉我EditorTemplate在功能上是正确的):

@foreach (var item in Model.Employees)
{
    @Html.EditorFor(x => item, "EmployeeEditorTemplate")
}
Run Code Online (Sandbox Code Playgroud)

此构造也无法发布company.Employees集合回到我的其他控制器操作.

有关实现以下目标所需要的任何想法?

  • 使用列表中的每个实例呈现具有唯一ID的子集合
  • 使用模型将子集合发回

我不在乎我是否必须自己列举它,也不管它是在EditorTemplate内部还是外部; 我刚刚看到它说这是不必要的,如果你让它处理事情,MVC会更好.谢谢.

Mar*_*arc 5

Per @ David-Tansey(来自这个答案 - 请参阅更详细的解释):

(改为适合这个问题):

当您使用@Html.EditorFor(c => c.Employees)MVC约定时,选择默认模板IEnumerable.此模板是MVC框架的一部分,它Html.EditorFor()为枚举中的每个项生成的内容.然后,该模板为列表中的每个项目单独生成相应的编辑器模板 - 在您的情况下,它们都是Employee的实例,因此,Employee模板用于每个项目.


综上所述他对当您使用命名模板的解释,你是,实际上,经过整个IEnumerable<Employee>一个模板期待一个单一的Employee使用@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate").

注意:我真的只回答了这个,因为它没有答案,我先在这里跌跌撞撞.至少现在有人不关闭它,可能会错过答案,而不必经历重复问题投票的严峻考验,等等等等.