13

我有一个带有代表员工时间表的表格的视图。上方的天数,下方的项目,每天/项目交叉点包含两个值,分别表示正常工作时间和加班时间。

页面模型的(简化的)类定义是:

public class TimesheetFormModel {
    public List<Project> Projects;
    // other things...
}
public class Project {
    public string Name;
    public List<WorkUnit> WorkUnits;
}
public class WorkUnit {
    public DateTime Date;
    public decimal RegularHours;
    public decimal OvertimeHours;
}

页面上的表单元素命名如下,以尝试让 DefaultModelBinder 获取它们。

model.Projects[0].Name // "New Project"
model.Projects[0].WorkUnits[0].Date // "5/23/2009 12:00:00 AM"
model.Projects[0].WorkUnits[0].RegularHours // 0
model.Projects[0].WorkUnits[0].OvertimeHours // 0

model.Projects[0].WorkUnits[1].Date // "5/24/2009 12:00:00 AM"
model.Projects[0].WorkUnits[1].RegularHours // 0
model.Projects[0].WorkUnits[1].OvertimeHours // 0

model.Projects[0].WorkUnits[2].Date // "5/25/2009 12:00:00 AM"
model.Projects[0].WorkUnits[2].RegularHours // 0
model.Projects[0].WorkUnits[2].OvertimeHours // 0

// etc.

然而,当视图被提交时,model参数并没有被完全填充。model.Projects包含项目,但Project'WorkUnits字段为空。是否DefaultModelBinder像我想要的那样支持嵌套集合?如果没有,我该怎么办?

4

1 回答 1

13

我最终弄清楚了为什么DefaultModelBinder不使用 的属性WorkUnit:因为它们不是属性,它们是字段DefaultModelBinder仅适用于属性。更改类定义WorkUnitProject使用字段使所有内容都单击:

public class Project {
    public IList<WorkUnit> WorkUnits { get; set; }
    public string Name { get; set; }
}

public class WorkUnit {
    public DateTime Date { get; set; }
    public decimal RegularHours { get; set; }
    public decimal OvertimeHours { get; set; }
}

(注意:原始问题中的源代码将 Project.Name 定义为一个字段,在我的实际代码中它是一个属性。这就是为什么 Projects 列表被填充但 WorkUnits 没有填充的原因。)

于 2009-06-17T20:56:09.380 回答