2009-06-16 3 views
13

Ich habe eine Ansicht mit einer Tabelle, die die Arbeitszeittabelle eines Mitarbeiters darstellt. Tage an der Spitze, Projekte an der Seite, wobei jeder Tag/Projekt-Schnittpunkt zwei Werte für reguläre Stunden und Überstunden enthält.ASP.NET MVC DefaultModelBinder mit verschachtelten Listen

Die (vereinfachte) Klassendefinitionen für die Seite Modells 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 der Default abholen zu bekommen.

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, die model Parameter sind nicht vollständig besiedelt. model.Projects enthält Projekte, das Feld WorkUnitsProject ist jedoch leer. Unterstützt die DefaultModelBinder verschachtelte Sammlungen, wie ich es versuche? Wenn nicht, was soll ich tun?

Antwort

13

ich heraus, schließlich dachte, warum DefaultModelBinder nicht auf die Eigenschaften von WorkUnit Aufnehmen wurde: Weil sie nicht Eigenschaften waren, waren sie Felder. DefaultModelBinder funktioniert nur mit Eigenschaften. Ändern die Klassendefinition von WorkUnit und Project zu 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 es eine Eigenschaft war. Aus diesem Grund wurde die Projektliste ausgefüllt, aber WorkUnits nicht.)