2013-04-03 5 views
1

У меня есть несколько моделей вложенных представлений, используемых для отображения вопросника, управляемого из базы данных. Отображение вопросов прост, но я не знаю, как привязываться к модели или анализировать выбранные ответы на submit.С MVC, как я могу привязать список выбранных переключателей?

Мои объекты выглядят как (псевдо):

public class QuestionSheetViewModel(){ 
    public list<QuestionViewModel> Questions; 
    public string UserName; 
} 

public class QuestionViewModel(){ 
    public int QuestionId; 
    public string QuestionText; 
    public dictionary<int, string> answers; 
} 

На мой взгляд, я итерацию по вопросам, отображая каждый текст вопроса, а затем рендеринг каждый ответ, как радио-кнопки:

@Html.RadioButton(question.QuestionID, answer.Key()); 

По используя question.questionId в качестве имени переключателя они группируются вместе, ограничивая пользователя одним ответом на вопрос.

Когда я отправляю, список вопросов по модели пуст. Можно ли автоматически привязать это к моей модели представления? Если нет, что мне нужно сделать, чтобы написать что-нибудь, чтобы разобрать представленную форму, чтобы найти выбранный ответ для каждого вопроса?

Спасибо

ответ

2

Вы можете адаптировать свои модели немного, чтобы соответствовать вашим требованиям:

public class QuestionSheetViewModel 
{ 
    public List<QuestionViewModel> Questions { get; set; } 
    public int QuestionId { get; set; } 
} 

public class QuestionViewModel 
{ 
    public string QuestionText { get; set; } 
    public int SelectedAnswerId { get; set; } 
    public List<AnswerViewModel> Answers { get; set; } 
} 

public class AnswerViewModel 
{ 
    public int AnswerId { get; set; } 
    public string Text { get; set; } 
} 

и затем контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new QuestionSheetViewModel 
     { 
      QuestionId = 1, 
      Questions = new[] 
      { 
       new QuestionViewModel 
       { 
        QuestionText = "question 1", 
        SelectedAnswerId = 2, 
        Answers = new[] 
        { 
         new AnswerViewModel { AnswerId = 1, Text = "answer 1" }, 
         new AnswerViewModel { AnswerId = 2, Text = "answer 2" }, 
        }.ToList() 
       }, 
       new QuestionViewModel 
       { 
        QuestionText = "question 2", 
        SelectedAnswerId = 3, 
        Answers = new[] 
        { 
         new AnswerViewModel { AnswerId = 3, Text = "answer 3" }, 
         new AnswerViewModel { AnswerId = 4, Text = "answer 4" }, 
        }.ToList() 
       }, 
      }.ToList() 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(QuestionSheetViewModel model) 
    { 
     // When the form is submitted the model will be properly bound 
     return View(model); 
    } 
} 

с соответствующим видом (~/Views/Home/Index.cshtml) :

@model QuestionSheetViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(x => x.QuestionId) 
    <ul> 
     @Html.EditorFor(x => x.Questions) 
    </ul> 
    <button type="submit">OK</button> 
} 

и соответствующий шаблон редактора, который будет автоматически оказываемая конвенции по каждому вопросу (~/Views/Shared/EditorTemplates/QuestionViewModel.cshtml):

@model QuestionViewModel 

<li> 
    @Html.DisplayFor(x => x.QuestionText) 
    @Html.HiddenFor(x => x.QuestionText) 
    <ul> 
     @for (int i = 0; i < Model.Answers.Count; i++) 
     { 
      <li> 
       @Html.HiddenFor(x => x.Answers[i].AnswerId) 
       @Html.HiddenFor(x => x.Answers[i].Text) 
       @Html.RadioButtonFor(x => x.SelectedAnswerId, Model.Answers[i].AnswerId) 
       @Html.DisplayFor(x => x.Answers[i].Text) 
      </li> 
     } 
    </ul> 
</li> 
+0

Спасибо за обстоятельный ответ, он делает много смысла! Я реализовал такие вещи таким образом, и предоставление вопросов отлично работает, но при отправке модель полностью пуста. Он пуст не только для вопросов/ответов, но и для других полей объекта «QuestionSheet» (я просто добавил в качестве примера поле «UserName»). У вас есть идеи, почему это было бы? Бесконечно благодарен. – user2241047

+0

И решил, добавив get/set в мою модель представления. еще раз спасибо – user2241047

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