ネストされたリストを持つASP.NET MVC DefaultModelBinder
-
05-07-2019 - |
質問
従業員のタイムシートを表すテーブルを持つビューがあります。上部にある日数、側面にあるプロジェクト、各日/プロジェクトの交点には通常の時間と残業の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
の WorkUnits
フィールドは空です。 DefaultModelBinder
は、私がやろうとしているようなネストされたコレクションをサポートしていますか?そうでない場合は、どうすればよいですか
解決
最終的に、 DefaultModelBinder
が WorkUnit
のプロパティを取得しない理由を見つけました。これらは properties ではなかったため、 フィールド。 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になかった理由です。)
所属していません StackOverflow