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)

呈现如下所示的 EditorTemplate:@model MyNamespace.ExerciseForPupil

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

但是我在第二级(ExerciseItems)上的嵌套集合为空。我究竟做错了什么?

更新 我已根据@MysterMan 的建议更改了代码:我将练习的编辑器模板称为如下:

@Html.EditorFor(x => x.Lesson.Exercises)

在这个 EditorTemplate 中,我为我的 ExerciseItems 调用编辑器模板

@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

2

不要使用 foreach。如果您传递一个集合,EditorTemplates 已经遍历集合。

@model MyNamespace.ExerciseForPupil

@using (Html.BeginForm("ScoreExercise", "SharedLesson"))
{
    @Html.HiddenFor(x => x.Id)
    @Html.EditorFor(x =>  x.ExerciseItemsForPupil)
    <input type="submit" value="Submit"/>
}

有几点需要注意。您不必传递模板名称,因为模板名称已经与项目类型同名。您不必使用 Post 表单方法,因为这是默认设置。List 没有属性的名称,所以我只是假设它是复数。

您的最后一堂课也是非法的,您不会将其指定为这样的列表。

于 2013-04-28T20:37:48.807 回答