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?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top