Группа с несколькими ответами и ответы asp.net MVC
Я хочу сделать один или несколько тестов ответов с использованием radiobuttonfor и checkboxFor, но я не могу заставить его работать. Проблема со всеми примерами, которые я вижу, состоит в том, что модель "Вопрос" также регистрирует SelectedAnswer, но в моем случае я хочу, чтобы каждый возможный ответ был выбираемым, поскольку некоторые вопросы будут иметь несколько ответов, и, таким образом, свойство isSelected находится непосредственно внутри модели "Ответ".
Следовательно, для вопросов с отдельными ответами, когда я пытаюсь создать свою модель с помощью RadioButtonFor(m => m[question].Answers[answerToDisplayId].IsSelected), каждый ответ находится в своей собственной группе и не проверяется, когда я проверяю другой ответ из этого вопроса (в основном это ведет себя как checkBoxFor)
Что у меня сейчас есть: модель вопроса
public enum questionfield
{
Chaser, Beater, Seeker, Contact, Process, Other
};
public enum QuestionDifficulty
{
Basic, Advanced
};
public enum AnswerType
{
SingleAnswer, MultipleAnswer
}
public class Question
{
public int Id { get; set; }
[Required(ErrorMessage = "Question name not valid")]
public string Name { get; set; }
[Required]
public QuestionField Field { get; set; }
[Required]
public QuestionDifficulty Difficulty { get; set; }
[Required]
public bool IsVideo { get; set; }
public string VideoURL { get; set; }
[Required]
public string QuestionText { get; set; }
[Required]
public AnswerType AnswerType { get; set; }
[Required]
public List<Answer> Answers { get; set; }
[Required]
public String AnswerExplanation { get; set; }
Модель ответа:
public class Answer
{
public int Id { get; set; }
public String Answertext { get; set; }
public Boolean IsTrue { get; set; }
public Boolean IsSelected { get; set; }
}
Вид:
<div>
<!-- For each Question, display a new div with the Title, the question code, the question text, the video if there is one, then the possible answers depending on the type of answers-->
@using(Html.BeginForm("QuizzResult", "Home"))
{
for(int i = 0; i < Model.Count; i++)
{
<div class="QuizzQuestion">
<div class="QuizzQuestionTitle">@Model[i].Id : @Model[i].Name</div> @Html.HiddenFor(m => Model[i].Id)
<div class="QuizzQuestiontext">@Model[i].QuestionText</div>
@if(@Model[i].IsVideo)
{
<div class="QuizzQuestionVideoContainer">
<iframe class="QuizzQuestionVideo" id="ytplayer" type="text/html"
src="@Model[i].VideoURL"
frameborder="0"></iframe>
</div>
}
<div class="RadioButtonAnswers">
@if (@Model[i].AnswerType == QRefTrain3.Models.AnswerType.SingleAnswer)
{
for (int j = 0; j < Model[i].Answers.Count; j++)
{
@Model[i].Answers[j].Answertext @Html.RadioButtonFor(m => m[i].Answers[j].IsSelected, true)
@Html.HiddenFor(m => Model[i].Answers[j].IsTrue)
}
}
</div>
</div>
}
<input type="submit" value="Validate Answers"/>
}
</div>
Контроллер:
[HttpPost]
public ActionResult QuizzResult(List<Question> answers)
{
foreach(Question a in answers)
{
var b = Request.Form[a.Id.ToString()];
}
Result result = new Result();
foreach (Question q in answers)
{
result.QuestionsAskedIds.Add(q.Id);
if (Question.IsGoodAnswer(q))
{
result.GoodAnswersIds.Add(q.Id);
}
}
if (User.Identity.IsAuthenticated)
{
result.User = Dal.Instance.GetUserByName(HttpContext.User.Identity.Name);
Dal.Instance.CreateResult(result);
}
return View("QuizResult", result);
}
Каков был бы хороший способ сделать это? Спасибо!
1 ответ
В случае, если кто-то увидит это:
Решение, которое я нашел, состояло в том, чтобы изменить модель: вместо того, чтобы иметь один параметр IsSelected на ответ, добавьте List selectedAnswers к вашей модели Вопросов. Затем, в представлении, добавьте свою кнопку радио следующим образом:
@Html.RadioButtonFor(m => m[i].SelectedAnswers, Model[i].Answers[j].Id)
Вы сохраните идентификатор каждого выбранного ответа на этот вопрос в списке SelectedAnswers. Затем вы можете создать свои результаты, используя эти данные.