2015-12-11 2 views
0

У меня есть модель 2: вопрос и ответ, например ниже, я хочу отправить модель списка для просмотра, а при отправке формы я отправлю модель списка контроллеру, но в действии UpdateQuestion a может получить список вопросов, но списка ответов не было. Можете ли вы объяснить и показать мне, как получить список ответ на каждый вопрос, когда я отправить формуКак передать список <model> контроллеру в MVC 4

public class Question 
    { 
     [Key] 
     public int Id { get; set; } 

     [ForeignKey("QuestionType")] 
     public int QuestionTypeId { get; set; } 
     public virtual QuestionType QuestionType { get; set; } 

     [ForeignKey("Field")] 
     public int FieldId { get; set; } 
     public virtual Field Field { get; set; } 

     public string Brief { get; set; } 

     public bool IsGroup { get; set; } 

     [ForeignKey("QuestionGroup")] 
     public int? QuestionGroupId { get; set; } 
     public virtual QuestionGroup QuestionGroup { get; set; } 

     public int Priority { get; set; } 

     public int Order { get; set; } 

     public virtual ICollection<Answer> Answers { get; set; } 
    } 

и:

public class Answer 
    { 
     [Key] 
     public Int32 Id { get; set; } 

     [Column(TypeName = "ntext")] 
     [MaxLength] 
     public string Content { get; set; }  

     [ForeignKey("Question")]  
     public int QuestionId { get; set; } 
     public virtual Question Question { get; set; }  

     public float Mark { get; set; } 

     public int Priority { get; set; }  
    } 

У меня есть индекс контроллера для прохождения списка Вопрос для просмотра:

public ActionResult Index() 
{ 
    ApplicationDbContext db = new ApplicationDbContext(); 
      var listQuestion = db.Questions.ToList(); 
return View(listQuestion); 
} 

[HttpPost]

 public ActionResult UpdateQuestion(string submit, List<Question> Questions) 
     { 
     ... 

     return RedirectToAction("Index"); 
} 

И на виду:

@model List<Question> 
@{ 
    int i = 0; 
    int j = 0; 
} 
@using (Html.BeginForm("UpdateQuestion", "TestRoom")) 
{ 
    <ul> 
     @foreach(var question in Model)//Question 
     {         
       <li> 
       @Html.Hidden("Questions["+i+"].Id", question.Id) 
       @{i++;} 
       @Html.Raw(question.Brief) 
       <ul> 
        @foreach (var answers in question.Answers) 
        {            
         <li>@Html.RadioButton("Questions["+i+"]_Answers["+j+"]",answers.Id)             
               @Html.Raw(answers.Content) 

               @{j++;} 
              </li> 
             } 
             @{j = 0;} 
            </ul> 
           </li> 
          } 

         </ul> 
         <div class="aq-button-panel"> 
          <button type="submit" value="Finish" name="submit"><i class="icon-pencil"></i>Submit</button> 
          <button type="submit" value="Back" name="submit">Go Next <i class="icon-arrow-left"></i></button> 
          <button type="submit" value="Next" name="submit">Go Back <i class="icon-arrow-right"></i></button>       
         </div> 
        } 

ответ

1

Существует несколько проблем с кодом. Сначала вы не можете привязать переключатель к сложному объекту (в вашем случае Answer, потому что группа переключателей возвращает только одно значение (в вашем случае значение id выбранного Answer). Затем вы создаете группы переключателей, которые , пытается связать выбранный ответ только первый ответ, который не имеет никакого смысла (ваша установка значения j в 0 каждый раз). Ваша модель должна свойство связываться с (скажем) int SelectedAnswer.

Начнем с создания вид модели, представляющие то, что вы хотите отображать/редактировать в своем представлении (при необходимости добавить атрибуты отображения и подтверждения)

В вашем методе get, получите ваши модели данных и карту, затем в модели просмотра и верните IEnumerable<QuestionVM>.

Следующая создать EditorTemplate для TypeOf QuestionVM (/Views/Shared/EditorTemplates/QuestionVM.cshtml)

@model QuestionVM 
<li> 
    @Html.HiddenFor(m => m.ID) 
    @Html.DisplayFor(m => m.Brief) 
    <ul> 
    @foreach(var answer in Model.PossibleAnswers) 
    { 
     <li> 
     <label> 
      @Html.RadioButtonFor(m => m.SelectedAnswer, answer.ID, new { id = "" }) 
      <span>@answer.Content</span> 
     </label> 
     </li> 
    } 
    </ul> 
</li> 

и в главном окне

@model IEnumerable<QuestionVM> 
.... 
@Html.BeginForm(...)) 
{ 
    <ul> 
    @Html.EditorFor(m => m) // this will generate the correct html for each question in the collection 
    </ul> 
    <div class="aq-button-panel"> 
    <button type="submit" ... /> 
    ... 
    </div> 
} 

и изменить метод POST для

[HttpPost] 
public ActionResult UpdateQuestion(string submit, IEnumerable<QuestionVM> model) 

Сейчас модель содержит идентификатор каждого вопроса и идентификатор selec Ответ на каждый вопрос.

Обратите внимание, что если вам нужно вернуть вид, потому что ModelState недействителен, вам нужно будет заселить PossibleAnswers свойства каждого вопроса (вы не генерируя контроль формы для каждого свойства каждого Answer в каждом Question - и не должны вас), так что PossibleAnswers будет пустой коллекцией при отправке формы)

+0

Большое вам спасибо, я сделал это. Но другой вопрос, если у вопроса есть более одного ответа. Так вы можете сказать мне, как это сделать что ? – Phuong

+1

В этом случае ваша модель 'AnswerVM' будет иметь дополнительное свойство' bool IsSelected', а затем создать 'EditorTemplate' для' AnswerVM', который будет иметь скрытый ввод для 'ID' и флажок, привязанный к свойству' IsSelected' ,Внутри 'QuestionVM' замените' @ foreach', который генерирует радиокнопки с помощью '@EditorFor (m => m.PossibleAnswers)', который теперь генерирует флажок для каждого ответа. Обратите внимание, что 'int SelectedAnswer' больше не требуется. –

+1

Если, с другой стороны, вы хотите иметь разные типы вопросов, где некоторые из них имеют множественный выбор (например, переключатели), некоторые из них позволяют просто текстовый ответ, некоторые из них позволяют давать ответы «Да/Нет» и т. Д., Тогда вам нужна серия различных моделей просмотров - скажем, 'MultipleChoiceQuestionVM', YesNoQuestionVM' и т. д., а затем у вас в главной модели будут коллекции этих (скажем)' QuestionaireVM', которые содержат 'List ' и т. д. –

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