13

従業員のタイムシートを表すテーブルを含むビューがあります。上部の日数、側面のプロジェクト。各日/プロジェクトの交差点には、通常の時間と残業の2つの値が含まれています。

ページモデルの(簡略化された)クラス定義は次のとおりです。

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'sWorkUnitsフィールドは空です。DefaultModelBinder私がやろうとしているようなネストされたコレクションをサポートしていますか?そうでない場合は、どうすればよいですか?

4

1 に答える 1

13

DefaultModelBinder私は最終的に、 が のプロパティを取り上げなかった理由を突き止めました。それらはプロパティWorkUnitではなく、フィールドだったからです。プロパティでのみ機能します。フィールドのクラス定義を変更してフィールドを使用すると、すべてがクリックされました。DefaultModelBinderWorkUnitProject

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 には値が入力されていなかった理由です。)

于 2009-06-17T20:56:09.380 に答える