2009-06-16 8 views
13

Tengo una vista con una tabla que representa la parte de horas del empleado. Los días en la parte superior se proyectan hacia un lado, con cada intersección de día/proyecto que contiene dos valores para las horas regulares y las horas extraordinarias.ASP.NET MVC DefaultModelBinder con listas anidadas

Los (simplificado) definiciones de clases para el modelo de página son:

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

Los elementos de formulario en la página se nombran de la siguiente manera en un intento de conseguir la DefaultModelBinder para recoger en ellas.

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. 

Cuando la vista se presenta sin embargo, el parámetro model no está siendo completamente poblado. model.Projects contiene proyectos, pero el campo ProjectWorkUnits está vacío. ¿El DefaultModelBinder es compatible con colecciones anidadas como las que trato de hacer? Si no, ¿qué debería hacer?

Respuesta

13

con el tiempo me di cuenta de por qué DefaultModelBinder no se den cuenta de las propiedades de WorkUnit: porque no eran propiedades, eran campos. DefaultModelBinder solo funciona con propiedades. Cambio de la definición de clase de WorkUnit y Project utilizar campos hizo que todo haga clic en:

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

(Nota: El código fuente en la pregunta original había Project.Name definido como un campo, en mi código real que era una propiedad. Esta es la razón por la cual la lista de Proyectos se estaba llenando, pero no estaba WorkUnits).

Cuestiones relacionadas