Отправка вложенной коллекции из представления в контроллер post с использованием привязки модели по умолчанию

#c# #asp.net #asp.net-mvc-4 #razor #model-binding

#c# #asp.net #asp.net-mvc-4 #razor #привязка модели

Вопрос:

Я создаю asp.net веб-приложение mvc. У меня есть следующая настройка, чтобы мое приложение могло задавать человеку вопросы с несколькими вариантами ответов.

 public class NewPerson
{
   public List <Question> Question {get; set;}
   // and other properties
 }

public class Question
{
    public int QuestionId{get; set;}
    public string QuestionText {get; set;}
    public List<Answer> Answers {get; set;} //list of multi-choice answers
}

public class Answer
{
     public int Answerid{get; set;}
     public string AnswerText {get; set;}             
 }
 

В моем контроллере у меня есть экземпляр newPerson, который заполнен вопросами и ответами. Затем это отправляется в представление. Я хочу, чтобы мое представление отправляло эти данные обратно на контроллер post. Я попытался сделать это, используя привязку модели по умолчанию. Я попытался использовать метод, предложенный
http://www.c-sharpcorner.com/UploadFile/pmfawas/Asp-Net-mvc-how-to-post-a-collection /

В моем представлении razor у меня есть

 @model MyProject.ViewModels.NewPerson
 

Следующий код позволяет связующему модели привязывать свойства QuestionID и questionText

 for(int i = 0; i < Model.Questions.Count; i  )
    {
        @Html.HiddenFor(modelItem => Model.Questions[i].QuestionId)
        @Html.HiddenFor(modelItem => Model.Questions[i].QuestionText)
    }
 

Я хотел бы сделать что-то подобное для списка ответов, но я не вижу способа это сделать. Любая помощь о том, как это сделать, была бы очень признательна!

Ответ №1:

Для доступа вам понадобится вложенный цикл for Questions[i].Answers[m]

    @for (int i = 0; i < Model.Questions.Count(); i  )
   {
      @Html.HiddenFor(modelItem => Model.Questions[i].QuestionText)    

       for (int m = 0; m < Model.Question[i].Answers.Count(); m  )
       {
          @Html.HiddenFor(modelItem => Model.Questions[i].Answers[m].AnswerText)
       }
   }
 

Если у кого-то есть вопросы о том, как заполнить модель, сделайте это следующим образом

 NewPerson model = new NewPerson();

model.Questions = (insert LinQ Query).ToList();

foreach(var item in model.Questions)
{
   item.Answers = (insert LinQ Query).ToList();
}
 

Комментарии:

1. Идеально! Хотя, предположительно, вы имеете в виду m <Model.ListModel . Большое вам спасибо!

2. Да, я протестировал это со своими объектами, так что вы можете увидеть опечатку, думаю, я исправил все это сейчас