Посмотрите на входные имена, которые генерируются в вашем HTML.Я думаю, что у вас есть проблема с именованием ваших элементов управления, поэтому привязка модели по умолчанию не работает, поскольку вы упомянули, что использование FormCollection
работает правильно.Я делаю это предположение, так как я не знаю, как выглядят ваши классы вопросов и ответов
<%= Html.TextBoxFor(model =>
model.Answers[(int)question.QuestionID - 1].AnswerValue) %>
Не приведёт ли это к чему-то похожему на следующее;который, если я не ошибаюсь, не будет привязываться к вашей модели.То же самое относится к RadioButtons
.
<input type="text" name="Answers[0].AnswerValue" id="Answers_0__AnswerValue" value="somevalues"/>
Помощник RadioButton должен иметь значение
<%= Html.RadioButton("Questions[" + question.QuestionID + "].ID", "Yes", false)%> // you now get a list of questions
<input type="radio" name="Questions[1].ID" id="Questions_1__ID" value="No" checked="checked"/>
Есть несколько способов решить эту проблему:
- Правильно назовите ваши элементы управления вводом, чтобы они соответствовали вашей ViewModel.(Это включает в себя разноску всех обязательных полей для вашей модели - я думаю, что эти значения по умолчанию используются, когда привязка модели происходит, если она не разнесена)
- Создание привязки пользовательской модели
- Вы можетенужно сказать Binder, каков префикс полей ввода.(
[Bind]
атрибут ), чтобы специально включить или исключить поля формы. - Создать новую модель, содержащую значения, которые вы ожидаете отправить обратно
Я думаю, чтоВ целом, что ваш подход должен немного измениться.Из предоставленной информации ваши вопросы и ответы тесно связаны.В зависимости от типа вопроса ваш «ответ» может быть либо логическим, либо свободным текстом.В данный момент вы не отправляете List<Questions>
обратно на сервер.Ответы, да, но они не являются, я не думаю, что это признается как List<Answers>
.
Haacked имеет пост, который, я думаю, связан с вашей проблемой, и этот вопрос SO дополнительно указывает, что он все еще может применяться к ASP-MVC-2.