ASP.NET MVC DefaultModelBinder com listas aninhadas
-
05-07-2019 - |
Pergunta
Eu tenho uma visão com uma tabela representando quadro de horários de um empregado. Dias na parte superior, projectos para baixo o lado, com cada intersecção dia / projeto que contém dois valores para horas normais e extras.
Os (simplificado) definições de classe para o modelo de página são:
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;
}
Os elementos de formulário na página são nomeados da seguinte forma em uma tentativa de obter o DefaultModelBinder para pegar neles.
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 a vista é submetido no entanto, o parâmetro model
não está sendo completamente preenchidos. model.Projects
contém projetos, mas o campo Project
do WorkUnits
está vazio. Será que o apoio DefaultModelBinder
coleções aninhadas que estou tentando fazer? Se não, o que devo fazer?
Solução
Eu finalmente descobri porque DefaultModelBinder
não estava pegando nas propriedades de WorkUnit
: Porque eles não eram Propriedades , eles foram campos . DefaultModelBinder
só funciona com propriedades. Alterar a definição de classe de WorkUnit
e Project
a campos de uso fez tudo clique:
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:.. O código fonte na pergunta original tinha Project.Name definido como um campo, no meu código real que era uma propriedade É por isso que a lista Projetos estava sendo povoada, mas WorkUnits não era)