4

这比较莫名其妙。为简单起见,想象一个具有 .Employees 可枚举属性的公司实体。我在 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 处理事情,它会更好地工作。谢谢。

4

3 回答 3

6

每@David-Tansey(来自这个答案- 看到更详细的解释):

(更改为适合这个问题)

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


总结一下他对何时使用命名模板的解释,实际上,您是通过 using将整个模板传递IEnumerable<Employee>给期望单个模板。Employee@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate")

注意:我真的只回答了这个,因为它没有答案,我首先在这里偶然发现。至少现在有人不会关闭它,并且可能会错过答案,而不必经历获得重复问题投票的繁琐程序,等等。

于 2013-08-02T14:13:29.117 回答
2

你可以在这里阅读:Hanselman 的文章

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

int i=0;
@foreach (var item in Model.Employees)
{
   @Html.TextBox(string.Format("Model[{0}].FullName", i), item.FullName)
   i++;
}
于 2013-08-01T21:49:46.383 回答
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 回答