ASP.NET MVC DefaultModelBinder с вложенными списками - PullRequest
13 голосов
/ 17 июня 2009

У меня есть представление с таблицей, представляющей расписание сотрудника. Дни через вершину, проекты вниз, с каждым пересечением дня / проекта, содержащим два значения для обычных часов и сверхурочных.

(упрощенные) определения классов для модели страницы:

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 пусто. DefaultModelBinder поддерживает вложенные коллекции, как я пытаюсь сделать? Если нет, что мне делать?

1 Ответ

13 голосов
/ 18 июня 2009

В конце концов я понял, почему 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 - нет.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...