I have a dynamically populated list of questions and answers.
Two problems:
- The questions and answers do not display after postback
- The selected answers are missing
Viewmodel
public class RegistrationViewModel : RegisterExternalLoginModel
{
//...etc...
public Question Question { get; set; }
public Answer Answer { get; set; }
public List<Question> Questions { get; set; }
public IList<Answer> PossibleAnswers { get; set; }
public List<SelectedAnswer> SelectedAnswers { get; set; }
public IList<SelectedAnswer> PreviousAnswers
{
set
{
foreach(Question q in Questions)
{
q.SelectedAnswers = value.Where(t => t.questionId == q.objectId).ToList() ;
}
}
}
}
Selected Answer
public Answer SelectedAnswer
{
get
{
if (SelectedAnswers != null && SelectedAnswers.Count > 0)
{
var answers = SelectedAnswers.Where(t => t.questionId == objectId);
if (answers.Count() == 1)
{
var result = Answers.Where(t => t.objectId == answers.First().answerId).First();
return result;
}
}
return null;
}
}
ActionResult
public ActionResult CreateQuestions()
{
RegistrationViewModel vm = new RegistrationViewModel();
IQFacade facade = new QFacade(CreateUserContext(true));
//Questions and Answers
vm.Questions = facade.GetQuestions().ToList();
vm.PossibleAnswers = facade.GetPossibleAnswers();
return View(vm);
}
Post
[HttpPost]
public ActionResult CreateQuestions(RegistrationViewModel vm)
{
var context = CreateUserContext(true);
try{
IQFacade f = new QFacade(context);
f.CreateSomething(vm.User.name, vm.etc, vm.SelectedAnswers);//Need all the answers here, but null
}
catch (Exception ex)
{
//error stuff, etc...
return View(vm);//the questions do not appear after this point. Do I need to bind them again from GetQuestions or shouldn't they still be a part of the vm object that I am returning?
}
}
return RedirectToAction("Index");
}
In the views, I am using an Editor Template
@Html.EditorFor(x => x.Questions)
Template
@foreach (var possibleAnswer in Model.Answers)
{
<div class="radio">
@Html.RadioButtonFor(question => question.SelectedAnswer, possibleAnswer.objectId, new { id = possibleAnswer.objectId })
<label for="@possibleAnswer.objectId">@possibleAnswer.text <span>@possibleAnswer.value</span></label> <p>@possibleAnswer.description</p>
</div>
}
Everything works the first time, but not after the postback. I have read through the dozens of similar SO posts. What am I missing?