ASP.NET MVC Default mit verschachtelten Listen
-
05-07-2019 - |
Frage
Ich habe eine Ansicht mit einem Tisch eines Mitarbeiters Zeiterfassungs darstellt. Tage über die Spitze ragt nach unten auf der Seite, mit jeder Tag / Projekt Kreuzung mit zwei Werten für die regelmäßigen und Überstunden.
Die (vereinfachte) Klassendefinitionen für die Seite Modell sind:
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;
}
Die Formularelemente auf der Seite genannt werden, wie in einem Versuch, folgt ihnen den Default abholen zu erhalten.
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.
Wenn die Ansicht jedoch vorgelegt wird, wird der model
Parameter nicht vollständig aufgefüllt wird. model.Projects
enthält Projekte, aber die Project
Feld des WorkUnits
ist leer. Ist die DefaultModelBinder
Unterstützung Sammlungen verschachtelt, wie ich zu tun bin versucht? Wenn nicht, was soll ich tun?
Lösung
ich schließlich herausgefunden, warum DefaultModelBinder
nicht wurde auf die Eigenschaften von WorkUnit
Aufnehmen: Weil sie nicht waren Eigenschaften , waren sie Felder . DefaultModelBinder
funktioniert nur mit Eigenschaften. Ändern der Klassendefinition von WorkUnit
und Project
verwenden Feldern alles klicken:
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; }
}
(Hinweis:. Der Quellcode in der ursprünglichen Frage war Project.Name als Feld definiert ist, in meinem eigentlichen Code war es eine Eigenschaft dieses Grund hat die Projektliste wurde bevölkert zu werden, aber WUs war es nicht.)