【问题标题】:EditorFor not rendering enumerable without @foreachEditorFor 在没有 @foreach 的情况下不呈现 ienumerable
【发布时间】:2013-08-01 21:37:17
【问题描述】:

这真是令人费解。为简单起见,想象一个具有 .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 处理事情,它会更好地工作。谢谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 razor mvc-editor-templates


    【解决方案1】:

    根据@David-Tansey(来自this answer - 更详细的解释见):

    (已更改以适合这个问题)

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


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

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

    【讨论】:

    • 我有一个确切的问题,我有一个名为 Children (List) 的集合,我的编辑名称应该是什么?什么是约定?
    【解决方案2】:

    你可以在这里阅读:Hanselman's article

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

    int i=0;
    @foreach (var item in Model.Employees)
    {
       @Html.TextBox(string.Format("Model[{0}].FullName", i), item.FullName)
       i++;
    }
    

    【讨论】:

    • 我考虑过往这个方向发展,但是这个问题的已接受答案中的示例肯定会在单实例编辑器之外显示 EditorFor(x => x.enumerable property)stackoverflow.com/questions/7135615/…
    • stackoverflow.com/a/16631512/141508找到答案;命名编辑器模板和可枚举模型绑定存在问题。将@Html.EditorFor(company => company.Employees, "EmployeeEditorTemplate") 替换为@Html.EditorFor(x => x.Employees)(未指定编辑器视图名称)实际上修复了它,并且该集合现在正在发回。我不喜欢回答自己的问题,所以我将把它留给其他人来简要总结 David Tansey 的回答。
    【解决方案3】:

    foreach 可以与@HTML.EditorFor 一起使用,示例见以下语法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多