2009-06-16 6 views
13

J'ai une vue avec un tableau représentant la feuille de temps d'un employé. Jours en haut, projets en bas, avec chaque jour/intersection de projets contenant deux valeurs pour les heures régulières et les heures supplémentaires.ASP.NET MVC DefaultModelBinder avec listes imbriquées

Les définitions de classe (simplifié) pour le modèle de la page sont:

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; 
} 

Les éléments de formulaire sur la page sont nommés comme suit pour tenter d'obtenir le DefaultModelBinder pour ramasser sur eux.

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. 

Lorsque la vue est soumise cependant, le paramètre model est de ne pas complètement peuplé. model.Projects contient des projets, mais le champ WorkUnits de Project est vide. Le DefaultModelBinder prend-il en charge les collections imbriquées comme j'essaie de le faire? Sinon, que dois-je faire?

Répondre

13

J'ai finalement compris pourquoi DefaultModelBinder ne captait pas sur les propriétés de WorkUnit: Parce qu'ils ne sont pas propriétés, ils étaient champs. DefaultModelBinder ne fonctionne qu'avec des propriétés. Modification de la définition de la classe de WorkUnit et Project d'utiliser des champs fait tout cliquez sur:

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; } 
} 

(Note: Le code source dans la question initiale avait Project.Name défini comme un champ, dans mon code réel était une propriété. C'est pourquoi la liste des projets était remplie, mais WorkUnits ne l'était pas.)