具有嵌套列表的ASP.NET MVC DefaultModelBinder

前端之家收集整理的这篇文章主要介绍了具有嵌套列表的ASP.NET MVC DefaultModelBinder前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个视图,一个表表示员工的时间表.顶部的天数,项目落后,每天/项目交点包含两个正常小时和加班时间的值.

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

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.Projects包含项目,但Project的WorkUnits字段为空. DefaultModelBinder是否支持嵌套集合,就像我想要做的那样?如果没有,我该怎么办?

解决方法

我最终弄清楚DefaultModelBinder为什么不在WorkUnit的属性上拾取:因为它们不是属性,它们是字段. DefaultModelBinder仅适用于属性.将WorkUnit和Project的类定义更改为使用字段,一切都会点击:
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定义为一个字段,在我的实际代码中它是一个属性,这就是为什么“项目”列表被填充,但是WorkUnits不是.)

猜你在找的asp.Net相关文章