ASP.NET MVC DefaultModelBinder con elenchi nidificati
-
05-07-2019 - |
Domanda
Ho una vista con una tabella che rappresenta la scheda attività di un dipendente. Giorni in alto, progetti in basso, con ogni giorno / intersezione del progetto contenente due valori per ore regolari e straordinari.
Le definizioni di classe (semplificata) per il modello di pagina sono:
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;
}
Gli elementi del modulo nella pagina sono denominati come segue nel tentativo di far sì che DefaultModelBinder li raccolga.
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.
Quando la vista viene inviata, tuttavia, il parametro model
non viene completamente popolato. model.Projects
contiene progetti, ma il campo Project
del WorkUnits
è vuoto. DefaultModelBinder
supporta raccolte nidificate come sto cercando di fare? In caso contrario, cosa devo fare?
Soluzione
Alla fine ho capito perché DefaultModelBinder
non stava rilevando le proprietà di WorkUnit
: poiché non erano proprietà , erano campi . DefaultModelBinder
funziona solo con le proprietà. La modifica della definizione di classe di WorkUnit
e Project
per utilizzare i campi ha fatto tutto clic:
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: il codice sorgente nella domanda originale aveva Project.Name definito come un campo, nel mio codice effettivo era una proprietà. Ecco perché l'elenco dei progetti veniva popolato ma WorkUnits no.)