ASP.NET MVC Только один из входных данных RadioButton передается контроллеру

Я новичок в NET MVC и пытаюсь разработать приложение, в котором пользователь будет отвечать на несколько вопросов,

У меня есть следующие модели, связанные с моим вопросом:

  • Вопрос
  • Выбор (включает идентификатор вопроса как FK)

и ViewModel

public class QuestionChoiceViewModel
{
    public Question Question { get; set; }
    public IEnumerable<Choice> Choices { get; set; }
}

В моем представлении я хочу отображать все вопросы с их вариантами ответа в виде переключателей, поэтому у меня есть следующие строки в моем представлении Choice/Index.

@model IEnumerable<WebApplication.Models.QuestionChoiceViewModel>


@using (Html.BeginForm("Index", "Choices", FormMethod.Post)) 
{
    @Html.AntiForgeryToken()
     <div class="form-horizontal">
        @foreach (var q in Model){
            @:<b>Question:</b>

            @Html.DisplayFor(modelItem => q.Question.questionText)
            <form class="form-group"> 
            @foreach(var c in q.Choices){
                <input type="radio" name="@c.choiceText" value="@c.choiceID" />
                 @c.choiceText 
                <br />
            }
            </form>
            <br />
        }

         <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="button" value="Back" class="btn btn-default" id="btnBack" />
                <input type="submit" name="btnSubmit" value="Submit" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Я показываю и могу выбирать из нескольких вопросов без проблем.

И для окончательного примера кода см. Мой controller принимает только тип FormCollection в качестве параметра.

public ActionResult Index(FormCollection form) 

Проблема: Когда я отлаживаю и вижу, что находится в форме, помимо токена и т. д., это значение только первой группы радиокнопок. Допустим, у меня есть 10 вопросов, но я получаю в контроллере то, что выбрано в 1-м вопросе. Что я сделал не так?

Также приветствуются любые советы по моему стилю, спасибо!


person Alp    schedule 11.07.2017    source источник
comment
Вы не можете использовать цикл foreach для своей модели. См. этот ответ   -  person    schedule 11.07.2017
comment
Стивен прав, значение «имя» ваших радиоприемников должно соответствовать имени свойства внутри модели. Прямо сейчас у вас есть текст выбора, заполняющий атрибут «имя».   -  person Ryan C    schedule 11.07.2017
comment
@StephenMuecke Спасибо за ваше время, ваш ответ был полезен для меня. Но когда я изменил свои свойства имени на идентификатор вопроса, я мог генерировать имена для переключателей точно так, как хотел. Потому что я все равно хотел сгруппировать их по идентификатору вопроса. На данный момент это работает, надеюсь, я не пропустил что-то еще.   -  person Alp    schedule 12.07.2017
comment
Если вы утверждаете, что это работает, то вы явно не проверяли это. В вашем коде много ошибок и ужасных практик. Возможно, этот ответ поможет указать вам в правильном направлении.   -  person    schedule 12.07.2017


Ответы (1)


На первый взгляд две вещи кажутся неуместными:

  • Внутренние теги формы <form class="form-group"> не обязательно должны быть формой, а вложенные формы могут вызвать проблемы.
  • Свойство имени радиовходов используется для их группировки, поэтому оно должно быть одинаковым для вариантов ответа на один вопрос, например. это должно быть @q.что-то вместо @c.choiceText

Кроме того, имя должно быть каким-то коротким идентификатором, а не текстом, предназначенным для пользователя, как я полагаю, c.choiceText:

Токены ID и NAME должны начинаться с буквы ([A-Za-z]), за ними может следовать любое количество букв, цифр ([0-9]), дефисов («-»), подчеркиваний («_») , двоеточия (":") и точки ("."). https://www.w3.org/TR/html401/types.html#type-name

person Loonquawl    schedule 11.07.2017
comment
Это помогло мне. Проблема была со вторым пунктом, который вы сделали. Я изменил свойства имени с идентификатором вопроса, чтобы они были сгруппированы именно так, как я хотел. Спасибо за ваше время :) - person Alp; 12.07.2017