2009-06-16 85 views
13

Tôi có Chế độ xem với bảng biểu thị bảng chấm công của nhân viên. Ngày trên đầu trang, các dự án xuống bên, với mỗi ngày/dự án giao nhau có chứa hai giá trị cho giờ thường xuyên và làm thêm giờ.ASP.NET MVC DefaultModelBinder với danh sách lồng nhau

The (đơn giản hóa) định nghĩa lớp cho các mô hình trang là:

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; 
} 

Các yếu tố hình thức trên trang được đặt tên như sau trong một nỗ lực để có được những DefaultModelBinder để chọn lên trên chúng.

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. 

Khi xem được gửi, tham số model không được điền hoàn toàn. model.Projects chứa các dự án, nhưng trường của WorkUnits trống. DefaultModelBinder có hỗ trợ các bộ sưu tập lồng nhau như tôi đang cố gắng làm không? Nếu không, tôi nên làm gì?

Trả lời

13

tôi cuối cùng đã tìm ra lý do tại sao DefaultModelBinder không được chọn lên trên các thuộc tính của WorkUnit: Bởi vì họ không tính, họ đã lĩnh vực. DefaultModelBinder chỉ hoạt động với các thuộc tính. Thay đổi định nghĩa lớp của WorkUnitProject sử dụng lĩnh vực làm tất cả mọi thứ vào:

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; } 
} 

(Lưu ý: mã nguồn trong câu hỏi ban đầu đã Project.Name định nghĩa là một lĩnh vực, trong mã thực tế của tôi đó là một tài sản. Đây là lý do tại sao danh sách Dự án đã được phổ biến nhưng WorkUnits không.)

Các vấn đề liên quan