2009-01-09 7 views
6

Je construis un questionnaire webvc mvc, et je ne peux pas comprendre comment passer un nombre inconnu d'arguments au contrôleur à partir du formulaire.Asp.Net formulaire MVC, avec des paramètres inconnus pour le contrôleur

Ma forme est quelque chose comme:

<% using (Html.BeginForm()) 
    { %> 
<div id="Content"> 
    <% foreach (var group in ViewData.Model.QuestionGroups) 
     { %> 
    <div class="Group"> 
     <%=group.Description %> 
     <% foreach (var question in group.Questions) 
      {%> 
     <div class="Question"> 
      <div class="QuestionTitle"> 
       <%=question.Title %> 
      </div> 
       <%=Html.Hidden("Id", question.ID) %> 
      <div class="QuestionText"> 
       <%switch (question.TypeAsEnum) 
        { 
         case QuestionTypeEnum.Text:%> 
       <%=Html.TextBox("somename") %> 
       <% break; 
         case QuestionTypeEnum.Number:%> 
       <%=Html.TextBox("somename") %> 
       <% break; 
         case QuestionTypeEnum.PhoneNumber:%> 
       <%=Html.TextBox("somename")%> 
       <% break; 
         case QuestionTypeEnum.Email:%> 
       <%=Html.TextBox("somename")%> 
       <% break; 
         case QuestionTypeEnum.Date:%> 
       <%=Html.TextBox("somename")%> 
       <% break; 
         case QuestionTypeEnum.YesNo:%> 
       <%=Html.RadioButton("somename", true)%> 
       <%=Html.RadioButton("somename", false)%> 
       <% break; 
         case QuestionTypeEnum.Alternative:%> 
       <%=Html.DropDownList("somename", question.Answers)%> 
       <% break; 
        }%> 
      </div> 
     </div> 
     <% } %> 
    </div> 
    <% } %> 
</div> 
<div id="submittButton"> 
    <%=Html.SubmitButton()%></div> 
<% } %> 

Maintenant, ce que je dois à mon contrôleur est Liste < ResponseAnswer>, où ResponseAnswer a les propriétés:

chaîne QuestionID, chaîne AnswerText, bool AnswerBool, nombre AnswerNumber, ...

Alors, comment puis-je passer un inconnu n nombre d'éléments contenant questionID, AnswerType et Answer au contrôleur. Dans les formulaires Web j'ai résolu cela en rendant le formulaire avec des répéteurs au lieu de foreach, puis en passant par le répéteur de questions vérifiant l'ID de contrôle, chaque élément répéteur contenant un élément interrogé caché et une entrée avec id = AnswerType. Mais cela va sérieusement casser la séparation des préoccupations en mvc?

Donc, y a-t-il un moyen de faire en sorte que mon contrôleur accepte la liste < ResultAnswer> et en quelque sorte construire cette liste sans rompre le soc, et sinon, comment puis-je transmettre l'ensemble au contrôleur les données de formulaire là au lieu de dans la vue.

Répondre

2

Garry fonctionnera (et, par conséquent, voté jusqu'à). Cependant, vous pouvez lier directement une liste, et je pense que c'est un peu plus élégant. There are instructions in this blog post.

+0

Hourra, quelqu'un a orthographié mon nom à droite! –

+0

Upvote pour le lien aussi, je savais que j'avais vu quelque part quelque part –

+0

Le lien ne fonctionne pas. Pouvez-vous fournir un échantillon de code? C'est la manière suggérée de répondre à SO. – Mahmoodvcs

9

Vous pouvez ajouter un argument à votre action comme

public ActionResult MyAction(FormCollection form) 

le paramètre form contiendra toutes les données de la forme affichée. De cela, vous pouvez faire ce que vous voulez.

Vous pourriez probablement implémenter un classeur qui pourrait correspondre à ResponseAnswers, mais je n'ai aucune expérience en la matière, donc je laisserai cela à quelqu'un d'autre.

2

Pour clarifier la réponse de gary, vous pouvez facilement marcher dans tous les champs de la forme comme la réponse de cette

foreach (string s in Request.Form.Keys) 
{ 
    if (s.Contains("number")) 
     number = int.Parse ((Request.Form[s])); 

    //do something 
} 
Questions connexes