代码之家  ›  专栏  ›  技术社区  ›  Brant Bobby

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

  •  13
  • Brant Bobby  · 技术社区  · 16 年前

    我有一个视图,其中有一个表表示员工的时间表。每天从上到下,每一天/项目交叉点包含两个正常工时和加班值。

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

    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 像我想做的那样支持嵌套集合?如果没有,我该怎么办?

    1 回复  |  直到 15 年前
        1
  •  13
  •   Brant Bobby    16 年前

    我终于明白了为什么 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定义为一个字段,在我的实际代码中,它是一个属性。这就是为什么项目列表被填充,但工作单元没有填充的原因。)