Строгий тип RadioButtonList MVC 3

Это вообще возможно? Может быть, я глуп, но я не могу применить ни один из ответов здесь или где-либо еще к моей конкретной ситуации.

Что я хочу сделать, так это передать строго типизированную модель викторины на мой взгляд. Викторина имеет коллекции вопросов. Вопрос имеет набор возможных ответов.

Вопросы выглядят так:

  • Вопрос.Текст
  • Вопрос.Id
  • Вопрос. Возможные ответы

Возможные ответы выглядят так:

  • Возможныйответ.Id
  • Возможный ответ. Значение
  • Возможныйответ.Ярлык
  • Возможныйответ.Выбрано

Я хочу передать викторину в представление, представление должно настроить форму, в которой каждый вопрос имеет radiobuttonlist(group) возможных ответов.

Текст вопроса 1 бла-бла-бла:

<input id="1_1" type="radio" name="question1"  value="1" />
<input id="1_2" type="radio" name="question1"  value="2" />
<input id="1_3" type="radio" name="question1"  value="3" />

Теперь меня не волнует именно формат идентификаторов переключателей в группе ... очевидно, что MVC должен заботиться ... поэтому, как бы я ни работал, я хочу это сделать. Но я ожидаю, что когда я отправлю форму в действие, я смогу просмотреть Вопросы и получить возможный ответ в каждой коллекции возможных ответов Вопроса с .isAnswer, помеченным как true:

foreach(var item in model.Questions)
{
    foreach(var aitem in item.PossibleAnswers)
    {
        if(aitem.Selected)
           //do some stuff
    }
}

так что я не понимаю.. это:

@foreach (var item in Model.Questions)
{
    @foreach (var jitem in item.PossibleAnswers)
    {
        @Html.RadioButtonFor(x => item.QuestionId, jitem.Value)

    }

 }

даже не близко .. может кто-нибудь объяснить, что я делаю неправильно? Моя модель неверна? Может ли MVC сделать это? Нужно ли мне изменить тип модели PossibleAnswer на RadioButtonListItems или что-то в этом роде? помощь!

------------------------------------ ** ОБНОВИТЬ ** --------- -------

@for (int i = 0; i < Model.Questions.Count(); i++)
{      
    <p>@Model.Questions.ElementAt(i).QuestionText</p>
    @Html.RadioButtonListFor(m => m.Questions.ElementAt(i).AnswerRadios,
        "Question" + i);        
}

Этот код, кажется, работает! По крайней мере, он выводит некоторые радиокнопки.. НО он выводит html как специальные объекты..

<td id="Question0_Container">

    <input id="Question0_1" name="Question0_value" type="radio" value="17" />
    <label for="Question0_1">1</label>

    <input id="Question0_2" name="Question0_value" type="radio" value="18" />
    <label for="Question0_2">2</label>

    <input id="Question0_3" name="Question0_value" type="radio" value="19" />
    <label for="Question0_3">3</label>

    <input id="Question0_4" name="Question0_value" type="radio" value="20" />
    <label for="Question0_4">4</label>

    <input id="Question0_5" name="Question0_value" type="radio" value="21" />
    <label for="Question0_5">5</label>

</td>

person billy jean    schedule 22.06.2011    source источник


Ответы (1)


Вот то, что я использую. Я сделал некоторые незначительные изменения, но он отлично работает.

person John Kalberer    schedule 22.06.2011
comment
Может быть, я что-то упускаю, но почему вы хотите, чтобы ваша модель имела типы RadioButtonList? Я хочу, чтобы моя модель была ответами... а не элементами списка радиокнопок... Вот где у меня проблема. Мне нужно изменить мою модель, чтобы она была htmlcontrols? Для меня это противоречит цели иметь строго типизированную модель. Если бы я был вынужден сделать это, я бы просто получил доступ к результатам, используя коллекцию форм, так как мне все равно нужно будет проанализировать элементы списка радиокнопок. - person billy jean; 22.06.2011
comment
Ну, RadioButtonListItems являются дженериками, поэтому вы можете изменить тип... Как я это вижу, ваша модель должна напрямую отражать ваше представление. Если у вас есть список выбора на вашей странице, ваша модель должна иметь IEnumerable‹SelectListItem›. Когда форма отправляет ответ, вы действительно заботитесь только о том, какой ответ был дан на каждый вопрос, верно? С RadioButtonListViewModel это именно то, что вы получаете. - person John Kalberer; 22.06.2011
comment
Я не претендую на звание эксперта. Но разве представление или структура не должны выполнять работу по преобразованию модели? Selectlistitem - это конкретная вещь, и это не то, что я моделирую. Это может быть превращено в него, но это не естественно то, чем оно является. Может в плане вида оно и есть но тогда ЗАЧЕМ его сильно типировать? Я мог бы также использовать viewbag нет? В чем выгода (реальный вопрос). В частности, если мне нужно выбрать типы для объектов в моей модели, которые зависят от представления, то почему бы просто не использовать коллекцию форм? Можно ли сделать htmlhelper, который будет принимать обычную коллекцию в качестве аргумента? - person billy jean; 23.06.2011
comment
Вы правы в этом отношении. Я думаю, когда я работаю с MVC, у меня всегда есть модель базы данных, а также модель представления. Я всегда переключаюсь между ними (AutoMapper хорош для этого) между контроллером и репозиторием. Как правило, модель и модель представления не сопоставляются 1 с 1, поскольку, как вы упомянули, будут элементы, специфичные для презентации. Я не часто использую viewbag, потому что я могу использовать модель представления как возвращаемый результат получения, а также параметр для публикации действия. - person John Kalberer; 23.06.2011
comment
Хорошо, спасибо, Джон. У меня есть модель БД/бизнес-объекты, и я также создаю модели представления для представлений, поскольку представление будет содержать любую комбинацию бизнес-объектов. Но все еще не уверен, что нам нужно создавать определенные типы представлений (т.е. radiobuttonlistitems) для модели. Я не создаю типы текстовых полей/флажков/выборов для модели просмотра, верно? Очевидно, это один из способов сделать это. Если бы я был умнее, я бы создал хелпер radionbuttonlist, который принимает коллекцию IList/IEnumerable в качестве одного из параметров ;') - person billy jean; 23.06.2011
comment
О, хорошо -- теперь я вижу. Да, вы можете сделать для него помощника (не знаю, почему его еще нет). Преимущество, которое я получил, используя RadioButtonListViewModel, заключается в том, что он правильно и четко группирует переключатели. Он также правильно привязывается, когда вы публикуете. Таким образом, если вы хотите иметь RadioButtonListItem‹Answer›, вы можете фактически получить выбранный ответ после создания и привязки RadioButtonListViewModel. Думаю, это просто личные предпочтения. - person John Kalberer; 23.06.2011
comment
Эй, Джон, это вообще отличается при использовании бритвы? stackoverflow.com/questions/2512809/ я пытаюсь использовать решение mogalzup .. вариант того, который вы рекомендовали, поскольку я не использую перечисления. Но я не могу заставить это идти. Когда я пытаюсь использовать помощника, он просит меня передать HtmlHelper‹TModel›?? Любые идеи? Я не могу для жизни меня понять это. - person billy jean; 24.06.2011
comment
Вы пытаетесь вызвать его как @Html.RadioButtonListFor(model => model.RadioButtonList)? Кроме того, убедитесь, что ваше частичное представление строго типизировано. Похоже, вы пытаетесь вызвать метод расширения, используя HtmlHelper вместо HtmlHelper‹YourViewModel›. - person John Kalberer; 24.06.2011
comment
Привет, Джон, спасибо, что помог мне. Мое представление строго типизировано, но мой список представляет собой коллекцию внутри другой коллекции в представлении. Итак, я просматриваю коллекцию вопросов и пытаюсь вызвать метод расширения, передав ответ radiobuttonlistitems. Должен ли я сделать частичное представление строго типизированным для коллекции ответов radiobuttonlist? - person billy jean; 24.06.2011
comment
Я бы просто сделал его строго типизированным для любой модели, которую вы возвращаете из своего действия. Таким образом, вы вызываете его как @Html.RadioButtonListFor(model => model.RadioButtonList). Если вы хотите сделать частичный строго типизированным список радиокнопок ответа, вы должны вызывать его как @Html.RadioButtonListFor(model =› model) (я полагаю). - person John Kalberer; 24.06.2011
comment
Привет, Джон, у меня все работает. Если у вас есть время (спасибо), я только что отредактировал сообщение выше. Проблема в том, что помощник, который я использую, выводит html как текст, а не разметку? Любые идеи? - person billy jean; 24.06.2011
comment
Помощник возвращает MvcString или обычную строку. Измените его на MvcString, если это не так. - person John Kalberer; 24.06.2011