ASP.NET MVC DefaultModelBinder с вложенными списками
-
05-07-2019 - |
Вопрос
У меня есть представление с таблицей, представляющей расписание сотрудника. Дни вверху, проекты внизу, где каждый день / пересечение проекта содержит два значения для обычных часов и сверхурочных.
(упрощенные) определения классов для модели страницы:
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;
}
Элементы формы на странице названы следующим образом, чтобы попытаться заставить DefaultModelBinder подобрать их.
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.
Когда представление передается, параметр model
заполняется не полностью. model.Projects
содержит проекты, но поле Project
WorkUnits
Project пустое. Поддерживает ли
DefaultModelBinder
вложенные коллекции, как я пытаюсь сделать? Если нет, что мне делать?
Решение
В конце концов я понял, почему DefaultModelBinder
не обнаружил свойства WorkUnit
: поскольку они не были свойствами , они были <я> поля . DefaultModelBinder
работает только со свойствами. Изменение определения класса WorkUnit
и Project
для использования полей заставило все щелкнуть:
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; }
}
(Примечание. В исходном коде исходного вопроса Project.Name был определен как поле, в моем собственном коде это было свойство. Именно поэтому список проектов заполнялся, а WorkUnits - нет.)