2015-12-15 2 views
0

Я работаю над приложением ASP.NET MVC, которое позволяет пользователям создавать свои собственные опросы. Ради простоты ответа на этот вопрос можно сказать, что они могут создавать опросы только с вопросами с несколькими вариантами выбора, каждый из которых будет отображаться в качестве опроса в качестве вопроса, сопровождаемого списком радиообъектов, представляющих каждый возможный ответ. Пользователи могут создавать столько вопросов с множественным выбором в опросе, сколько захотят.ASP.NET MVC Multiple Radiobutton Forms

Итак, у меня есть ViewModel следующим образом:

public class SurveyViewModel 
{ 
    public int Id { get; set; } 
    public IList<Question> Questions { get; set; } 
} 

public class Question 
{ 
    public int Id { get; set; } 
    public string Question { get; set; } 
    public IList<Answer> Answers { get; set; } 
} 

public class Answer 
{ 
    public int Id { get; set; } 
    public string LabelText { get; set; } 
} 

Обычно, я бы просто добавить поле для каждого вопроса в форме к SurveyViewModel. Тем не менее, в этом случае я, очевидно, не знаю, сколько вопросов существует, потому что пользователь может создавать сколько угодно, поэтому я не могу создать поле для хранения ответа пользователя для каждого вопроса.

Итак, мой вопрос: как я могу написать ViewModel и представление (в синтаксисе Razor), чтобы я мог представить форму контроллеру, так что ответы на каждое произвольное количество вопросов с множественным выбором могут быть спасенным?

Я долгое время стучал головой о стену на этом, поэтому вся помощь очень ценится! Спасибо!

+0

Привет, я должен уточнить - мы предполагаем, что вопросы были созданы ранее. Меня интересует только тот случай, когда мы представляем вопрос опроснику. –

ответ

1

Не уверен, что именно вы спрашиваете, потому что кажется, что у вас есть все, что вам нужно, или, по крайней мере, большая часть того, что вам нужно. На ваш взгляд, вы просто перепробовали бы более Questions на вашей модели просмотра, а затем для каждого вопроса, итерации свыше Answers. Единственное, что нужно иметь в виду, это то, что вам нужно использовать цикл for, а не foreach, чтобы вы могли индексировать свойства списка, позволяя Razor генерировать правильные имена ввода для modelbinder. Одна модификация вам нужно сделать, это добавить свойство, как следующее Question:

public int SelectedAnswerId { get; set; } 

Тогда ваш взгляд будет выглядеть примерно так:

@for (var i = 0; i < Model.Questions.Count(); i++) 
{ 
    <p>@Model.Questions[i].Question</p> 

    @for (var j = 0; j < Model.Questions[i].Answers.Count(); j++) 
    { 
     @Html.RadioButtonFor(m => m.Questions[i].SelectedAnswerId, Model.Questions[i].Answers[j].Id, new { id = "Question" + i.ToString() + "Answer" + j.ToString() }) 
     <label for="[email protected](i)[email protected](j)">@Model.Questions[i].Answers[j].LabelText</label> 
    } 
} 

EDIT: Исправленная радиокнопок этикетками по передавая идентификатор для каждого каждого переключателя и создавая метку с использованием этого идентификатора. В противном случае вы получите кучу ярлыков, которые фактически не активировали бы соответствующий переключатель.

+0

Ах спасибо, что делает трюк! Единственное, что я задал, это упрощенная версия того, что я на самом деле делаю ... Потому что могут быть и другие типы вопросов (например, когда вы вводите ответ в текстовое поле), мне приходится бросать каждый элемент в ' Вопросы к различным подклассам абстрактного класса «Вопрос». Я не могу понять, как вы можете заставить это работать с кастингом? Является ли это возможным? Я понимаю, что это ужасно грязный способ делать что-то, но так сильно, как я думал об этом, я не могу найти способ сделать это без всякого кастинга. Благодарю. –

+0

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

+0

Нет. Это все, что вам нужно. Пока 'Вопросам' правильно проиндексирован и по крайней мере одно свойство на нем опубликовано (другими словами, у вас есть хотя бы один ввод на вашей странице с именем типа' Вопросы [0] .Foo'), затем 'Вопросы' не должно быть нулевым. –

-1

Это похоже на другой вопрос, с которым я столкнулся некоторое время назад. Это должно помочь вам: Structure for MVC4 Survey Web App

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