2017-07-11 4 views
1

Je suis nouveau à NET MVC et j'essaie de développer une application où l'utilisateur répondra à quelques questions,ASP.NET MVC Une seule des entrées RadioButton est transmis au contrôleur

J'ai les modèles suivants liés à ma question:

  • question
  • Choice (comprend ID question FK)

et ViewModel

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

Dans mon vue Je veux afficher toutes les questions avec leurs choix répondant que les boutons radio, donc j'ai les lignes suivantes dans mon point de vue Choix/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> 
} 

Je montre et peux choisir parmi plusieurs questions sans problème.

Et pour l'échantillon final de code, voir mon contrôleur ne prend que FormCollection type que paramater

public ActionResult Index(FormCollection form) 

Le problème: Quand je vois le débogage et ce qui est sous la forme -besides Token etc.- est la valeur du seul groupe de radiobutton. Disons que j'ai 10 questions mais ce que je suis passé dans le contrôleur est tout ce qui est sélectionné dans la 1ère question. Qu'ai-je fait de mal?

En outre, tous les conseils sur mon style sont les bienvenus, merci!

+0

Vous ne pouvez pas utiliser une boucle 'foreach' pour votre modèle. Référez-vous à [cette réponse] (https://stackoverflow.com/questions/30094047/post-an-html-table-to-ado-net-datatable/30094943#30094943) –

+0

Stephen a raison, la valeur 'nom' de votre les radios doivent correspondre au nom de la propriété à l'intérieur du modèle. En ce moment, vous avez le texte de choix remplissant l'attribut 'nom'. –

+0

@StephenMuecke Merci pour votre temps, votre réponse m'a été utile.Mais quand j'ai changé mes propriétés de nom à l'identification de question, je pourrais créer des noms pour des boutons radio exactement comme je voulais. Parce que je voulais les regrouper avec l'identifiant de la question de toute façon. Cela fonctionne pour l'instant, j'espère que je ne manque pas autre chose. – Alp

Répondre

1

À première vue, deux choses semblent sur place:

  • Les balises forme interne <form class="form-group"> ne doivent pas nécessairement être sous forme, et les formes de nidification peuvent causer des problèmes.
  • La propriété name des entrées radio est utilisée pour les regrouper, de sorte qu'elle devrait être la même pour les choix d'une question, par ex. ça devrait être @q. quelque chose au lieu de @ c.choiceText

En outre, le nom doit avoir un identifiant court au lieu d'un texte ciblé à l'utilisateur, comme je supsect c.choiceText est:

ID et NOM jetons doit commencer par une lettre ([A-Za-z]) et peut être suivi d'un nombre quelconque de lettres, chiffres ([0-9]), traits d'union ("-"), traits de soulignement ("_"), deux points (":"), et des points ("."). https://www.w3.org/TR/html401/types.html#type-name

+0

Cela m'a aidé. Le problème était avec le deuxième point que vous avez fait. J'ai changé les propriétés du nom avec l'identifiant de la question afin qu'elles soient regroupées exactement comme je le voulais. Merci pour votre temps :) – Alp