Asp.net

帶有嵌套列表的 ASP.NET MVC DefaultModelBinder

  • March 5, 2010

我有一個帶有代表員工時間表的表格的視圖。上方的天數,下方的項目,每天/項目交叉點包含兩個值,分別表示正常工作時間和加班時間。

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

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像我想要的那樣支持嵌套集合?如果沒有,我該怎麼辦?

我最終弄清楚了為什麼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 沒有填充的原因。)

引用自:https://stackoverflow.com/questions/1004160