ASP.NET MVC中的DefaultModelBinder与嵌套列表

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 包含项目,但是ProjectWorkUnits字段为空。 DefaultModelBinder是否支持像我尝试的嵌套集合?如果不支持,我该怎么做?

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没有被填充的原因。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接