3

私は次のモデルクラスを持っています(クラスはこの質問のために単純化されています):

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="">

しかし、それも機能しません

4

1 に答える 1