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?

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top