2009-06-16 2 views
13

У меня есть вид со столом, представляющим расписание сотрудника. Дни вверху, проекты вниз, с каждым днем ​​/ проектным пересечением, содержащим два значения для регулярных часов и сверхурочных.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 не будучи полностью заселена. model.Projects содержит проекты, но поле ProjectWorkUnits пусто. DefaultModelBinder поддерживает вложенные коллекции, как я пытаюсь сделать? Если нет, что мне делать?

ответ

13

В конце концов я понял, почему 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 не был.)

Смежные вопросы