2013-04-28 2 views
2

У меня есть следующие классы модели (классы упрощает для целей данного вопроса):ASP.NET MVC 4 - EditorTemplate для вложенных коллекций

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"/> 
} 

Я также EditorTemplate для "ExerciseItemForPupil":

@model MyNamespace.ExerciseItemForPupil 
@Html.HiddenFor(model => model.Id) 
@Html.TextBoxFor(model => model.UserValue) 

Проблема: Как видно, на странице будет несколько форм. Мои действия «ScoreExercise» выглядит следующим образом:

public ActionResult ScoreExercise(ExerciseForPupil exercise) 
{ 
    //exercise.ExerciseItems is NULL 
} 

Но моя вложенная коллекция на втором уровне (ExerciseItems) равна нулю. Что я делаю неправильно?

UPDATE Я изменил код в соответствии с @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=""> 

, но он не работает также

ответ

2

Не используйте Еогеасп. 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, поэтому я просто предположил, что это множественное число.

Ваш последний класс также является незаконным, вы бы не указали его как список.

+0

, конечно, мой последний класс является незаконным. Это была моя ошибка. Но спасибо, что указали это –

+0

@PiotrPtak. У вас также есть ошибки в ExerciseForPupil и Lesson, у последних свойств у каждого нет имени свойства. Дело в том, что я должен делать предположения о вещах, если вы не предоставляете действительный код. Эти допущения могут быть или не быть правильными, поэтому старайтесь предоставить код, который действительно работает. –

+0

Я обновил свой вопрос. Я также избавляюсь от foreach и передаю коллекции в мои шаблоны редакторов, но он тоже не работает –

Смежные вопросы