2009-06-16 72 views
13

我有一個視圖,其中包含表示員工時間表的表格。跨越頂部的天數,向下投射,每天/項目交叉點包含常規時間和加班的兩個值。帶有嵌套列表的ASP.NET MVC DefaultModelBinder

(簡化)類的頁面模型定義是:

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包含項目,但ProjectWorkUnits字段爲空。 DefaultModelBinder是否支持像我試圖做的嵌套集合?如果不是,我該怎麼辦?

回答

13

我終於想通了,爲什麼DefaultModelBinder沒有對WorkUnit屬性撿:因爲他們沒有性能,他們領域DefaultModelBinder只適用於屬性。改變WorkUnitProject類定義使用了一切單擊字段:

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定義爲字段,在我的實際代碼,這是一個性質。這就是爲什麼Projects列表正在填充但WorkUnits不是。)