2010-09-10 11 views
1

J'ai du mal à trouver comment collecter les données d'une FormCollection lorsqu'elles sont soumises pour mon formulaire qui recueille les réponses pour un sondage. Plus précisément, mon problème concerne les questions comportant plusieurs options de choix (boutons radio) et un autre champ de zone de texte si les options ne s'appliquent pas.ASP.Net MVC Soumettre des données pour Survey

Mon enquête a la structure suivante:

QUESTION: [QuestionID, Texte, questiontype, OrderIndex]

MULTIPLE_CHOICE_OPTIONS: [MC_OptionId, QuestionID, OrderIndex, MC_Text]

RÉPONSE: [AnswerId, QuestionID, MC_OptionId (peut être nul), UserTextAnswer]

QUESTION_TYPES sont: [Multiple_Choice, Multiple_Choice_wOtherOption, FreeText ou Checkbox]

Mon point de vue est rendu sous la forme comme suit (pseudo code pour simplifier):

//Html.BeginForm 
foreach(Question q in Model.Questions) 
{ 
    q.Text //display question text in html 

    if (q.QuestionType == Multiple_Choice) 
    { 
     foreach(MultipleChoice_Option mc in Model.MULTIPLE_CHOICE_OPTIONS(opt => opt.QuestionId == q.QuestionId) 
     { 
      <radio name=q.QuestionId value=mc.MC_OptionId /> 
      // All OK, can use the FormCollectionKey to get the 
      // QuestionId and its value to get the selected MCOptionId 
     } 
    } 
    else if (q.QuestionType == Multiple_Choice_wOtherOption) 
    { 
     foreach(MultipleChoice_Option mc in Model.MULTIPLE_CHOICE_OPTIONS(opt => opt.QuestionId == q.QuestionId) 
     { 
      <radio name=q.QuestionId value=mc.MC_OptionId /> 
     } 
     <textbox name=q.QuestionId /> 
     // ****Problem - I can get the QuestionId from the FormCollection Key, but 
     // I don't know if the value is from the user entered 
     // textbox or from a MCOptionId*** 
    } 
} 
<button type="submit">Submit Survey</button> 

    // Html.EndForm 

que je faisais cette façon si retour dans l'action du contrôleur qui gère le poste que je pourrais Relisez la FormCollection par clé pour obtenir le questionId, et la valeur de chaque index pour obtenir le MCOptionID. Mais dans le cas de la question avec des boutons radio et une zone de texte tous avec la même touche de nom, comment puis-je déterminer si les données de formulaire proviennent du bouton radio ou de la zone de texte.

Je peux voir la façon dont je fais ces pauses parce que leur pourrait être le cas où une question (id = 1) a un MCOption w/Id = 5 de sorte que le bouton radio a une valeur de 5 et l'utilisateur entre 5 dans la zone de texte Autre. Lorsque le formulaire soumet, je vois que formcollection [key = "1"] a la valeur 5 et je ne peux pas dire si cela provient de usertext ou de la valeur radioButton référençant un MCOptionId.

Existe-t-il une meilleure façon d'aborder ce problème, soit la structure db, le code de rendu de vue ou la façon dont les contrôles de formulaire sont nommés? Peut-être que la collection de formulaires n'est pas le chemin à parcourir, mais j'ai été déconcentré sur la façon de poster et de faire fonctionner le modèle de liaison.

Merci pour toute aide, tournés en rond pour quelque chose qui semble assez simple.

Répondre

1

Considérez ce petit ... refactoring

//you're always rendering the radios, it seems? 
RenderPartial("MultipleChoice", Model.MULTIPLE_CHOICE_OPTIONS.Where(x => 
            x.QuestionId == q.QuestionId)); 

if (q.QuestionType == Multiple_Choice_wOtherOption) 
{ 
    <textbox name="Other|" + q.QuestionId />  
} 

et dans cette vue partielle fortement typée:

//Model is IEnumerable<MultipleChoice_Option > 
foreach (MultipleChoice_Option mc in Model) 
{ 
    <radio name=mc.Question.QuestionId value=mc.MC_OptionId />   
} 

Il semble que votre question portait sur le nom de zone de texte; être lié à la question par ID. Dans votre contrôleur, vous devez savoir explicitement quand rechercher n'importe quelle valeur dans la zone de texte.

string userAnswer = Request.Form["OtherEntry|" + someQuestionID].ToString(); 
Questions connexes