Asp.net mvc 用于在没有@foreach的情况下不呈现可枚举的编辑器

Asp.net mvc 用于在没有@foreach的情况下不呈现可枚举的编辑器,asp.net-mvc,asp.net-mvc-4,razor,mvc-editor-templates,Asp.net Mvc,Asp.net Mvc 4,Razor,Mvc Editor Templates,这相当令人困惑。为了简单起见,假设一个公司实体具有.Employees可枚举属性。我在其他地方看到过,让EditorTemplates明智地呈现枚举的诀窍是使用如下语法: 在Index.cshtml中: @Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate") EmployeeEditorTemplate.cshtml需要一名员工: @model MyNamespace.Models.Employee

这相当令人困惑。为了简单起见,假设一个公司实体具有.Employees可枚举属性。我在其他地方看到过,让EditorTemplates明智地呈现枚举的诀窍是使用如下语法:

在Index.cshtml中:

@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate") 
EmployeeEditorTemplate.cshtml需要一名员工

@model MyNamespace.Models.Employee
//...
@Html.EditorFor(x => x.FullName)
// ...etc.
类似这样的帖子:……表明modelbinder足够聪明,能够动态地找出绑定并为可枚举项编制索引。我得到了不同的结果(如果modelbinder不那么神奇的话,这正是我所期望的结果):

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

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

关于实现以下目标需要做些什么,你有什么想法吗

  • 使用列表中每个实例的唯一ID呈现子集合
  • 将子集合与模型一起发布

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

您可以在这里阅读:

简而言之,您应该在视图(index.cshtml)中编写:

Per@David Tansey(来源-请参阅以获取更详细的解释):

(为适应此问题进行了更改):

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


总结一下他关于何时使用命名模板的解释,实际上,您是通过使用
@Html.EditorFor(company=>company.employeeeditoremplate”)
将整个
IEnumerable
传递给一个需要单个
员工的模板


注意:我只回答了这个问题,因为它没有答案,所以我先在这里绊倒了。至少现在有人不会关闭它,可能会错过一个答案,而不必经历获取重复问题投票的繁琐过程,诸如此类。

foreach
可以与
@HTML.EditorFor
一起使用,例如,请参见下面的语法:

@foreach(var emp in @Model)
{ 
    @Html.EditorFor(d => emp.EmployeeName)
    @Html.EditorFor(d => emp.Designation)
    <br />
}
@foreach(@Model中的var emp)
{ 
@EditorFor(d=>emp.EmployeeName)
@EditorFor(d=>emp.Designation)

}
我考虑过朝这个方向发展,但这个问题的公认答案中的示例明确显示了
EditorFor(x=>x.enumerable属性)
在单个实例编辑器之外:在中找到了答案;命名编辑器模板和可枚举模型绑定存在问题。将
@Html.EditorFor(company=>company.EmployeeEditorTemplate”)
替换为
@Html.EditorFor(x=>x.Employees)
(未指定编辑器视图名称)实际上修复了该问题,现在该集合正在发回。我不喜欢回答我自己的问题,所以我将留给其他人简要总结大卫·坦西的答案)。我有一个确切的问题,我有一个名为Children(List)的集合,我的编辑应该叫什么名字?惯例是什么?
@foreach (var item in Model.Employees)
{
    @Html.EditorFor(x => item, "EmployeeEditorTemplate")
}
int i=0;
@foreach (var item in Model.Employees)
{
   @Html.TextBox(string.Format("Model[{0}].FullName", i), item.FullName)
   i++;
}
@foreach(var emp in @Model)
{ 
    @Html.EditorFor(d => emp.EmployeeName)
    @Html.EditorFor(d => emp.Designation)
    <br />
}