私は次のモデルクラスを持っています(クラスはこの質問のために単純化されています):
public class Lesson
{
public Guid Id {get;set;}
public string Name {get;set;}
public List<ExerciseForPupil> Exercises {get;set;}
}
public class ExerciseForPupil
{
public Guid Id {get;set;}
public string Name {get;set;}
public List<ExerciseItemForPupil> ExerciseItems {get;set;}
}
public class ExerciseItemForPupil
{
public Guid Id {get;set;}
public string Content {get;set;}
public string UserValue {get;set;}
}
ここで、ユーザーがレッスンの各演習の「UserValue」値を入力できるようにしたいと考えています。レッスンに5つの演習があるとしましょう。これらの演習を次のようにレンダリングします
@Html.EditorFor(x=>x.Lesson.Exercises)
@model MyNamespace.ExerciseForPupil のような EditorTemplate をレンダリングします。
@using (Html.BeginForm("ScoreExercise", "SharedLesson", FormMethod.Post))
{
@Html.Hidden("Id", Model.Id)
@if (Model.ExerciseItems != null)
{
foreach (var exerciseItem in Model.ExerciseItems)
{
@Html.EditorFor(x => exerciseItem, "ExerciseItemForPupil")
}
}
<input type="submit" value="Submit"/>
}
「ExerciseItemForPupil」の EditorTemplate もあります。
@model MyNamespace.ExerciseItemForPupil
@Html.HiddenFor(model => model.Id)
@Html.TextBoxFor(model => model.UserValue)
問題: ご覧のとおり、ページに複数のフォームがあります。私の「ScoreExercise」アクションは次のとおりです。
public ActionResult ScoreExercise(ExerciseForPupil exercise)
{
//exercise.ExerciseItems is NULL
}
しかし、第 2 レベル (ExerciseItems) のネストされたコレクションは null です。私は何を間違っていますか?
更新 @MysterMan のアドバイスに従ってコードを変更しました: 次のように演習のエディター テンプレートを呼び出します。
@Html.EditorFor(x => x.Lesson.Exercises)
この EditorTemplate 内で、ExerciseItems の Editor Template を呼び出します
@Html.EditorFor(x=>x.ExerciseItems)
これにより、UserValue プロパティの次のマークアップがレンダリングされます。
<input id="Lesson_Exercises_0__ExerciseItems_1__UserValue" name="Lesson.Exercises[0].ExerciseItems[1].UserValue" type="text" value="">
しかし、それも機能しません