У меня есть приложение для создания и редактирования опросов. Каждое обследование содержит набор вопросов и ответы (ответы). Когда создается опрос, набор вопросов генерируется из отдельной таблицы Questions
. Каждый год для каждого пользователя создается новый опрос с одним и тем же набором вопросов, с тем чтобы ответы могли сравниваться с течением времени.Создайте редактирующую модель на основе связанных данных
Когда создается опрос, ответы на каждый вопрос сохраняются, но пользователь может не дать ответа на каждый вопрос, и теперь мне нужно создать представление для редактирования существующих ответов.
Модели
public class Survey
{
public int ID { get; set; }
public int AreaID { get; set; }
public Status Status { get; set; }
public DateTime AssessmentDate { get; set; }
public virtual Area Area { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Question
{
public int ID { get; set; }
public string QuestionText { get; set; }
public virtual ICollection<Answer> Answers { get; set; }
}
public class Answer
{
public int ID { get; set; }
public int? Response { get; set; }
public int QuestionID { get; set; }
public int SurveyID { get; set; }
public virtual Question Question { get; set; }
public virtual Survey Survey{ get; set; }
}
Вот мой ViewModel, что я использую, чтобы создать свой взгляд на экран редактирования
public class SurveyResponseViewModel
{
public Assessment Assessment { get; set; }
public IEnumerable<Question> Questions { get; set; }
}
и кода в методе GET является
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Survey survey = db.Surveys.Find(id);
var viewModel = new SurveyResponseViewModel
{
Survey = survey,
Areas = new SelectList(db.Areas, "ID", "SubLevel").ToList(),
Questions = db.Questions.Where(q => q.isActive)
};
if (survey == null)
{
return HttpNotFound();
}
return View(viewModel);
}
Это заполняет мою модель представления всеми вопросами, но каждый вопрос содержит набор ответов. Как отображать и редактировать только ответ на каждый вопрос, связанный с этим опросом в представлении?
@foreach (var question in Model.Questions)
{
// Display the question
@Html.Raw(question.QuestionText)
// How to create an input for the associated response??
<input type="text" name="????" placeholder="Enter a number..." value="????" />
}
Обратите внимание, что ответ int?
и может иметь значение между 0
и 5
(или null
если пользователем еще не дал ответ). В идеале я бы хотел, чтобы это отображалось как радиокнопка для выбора возможных значений.
Во-первых, вы не можете использовать 'foreach' цикл для создания элементов управления формы для сбора (см [этот ответ] (http://stackoverflow.com/questions/30094047/html-table-to -ado-нетто-DataTable/30094943 # 30094943)). Во-вторых, (я полагаю), вопрос будет иметь только один ответ, поэтому вы рассматриваете модель для «вопроса», должен иметь один «ответ», а не набор ответов «Ответ» –
@StephenMuecke. В опросе есть список вопросов, но как может быть много случаев опроса, вопрос может иметь ответ в каждом опросе. Например, вопрос 1 в опросе 1 может иметь ответ 3, в то время как в другом опросе тот же вопрос может иметь ответ 7 – totalitarian
В этом случае почему бы не использовать другой цикл foreach? –