2010-03-31 4 views
0

Une valeur par défaut de 0 se glisse dans une application Surveys que je développe, sans aucune raison que je puisse voir. Le problème est le suivant:Groupe Html.RadioButton par défaut à 0

J'ai un groupe de Html.RadioButtons qui représentent les valeurs possibles qu'un utilisateur peut choisir pour répondre à une question d'enquête (1 == Pas du tout, 2 == Un peu, 3 == A lot). J'ai utilisé un type de données tinyint, qui ne permet pas null, pour stocker la réponse à chaque question.

Le code de vue ressemble à ceci:

<ol class="SurveyQuestions"> 
    <% foreach (SurveyQuestion question in Model.Questions) 
     { 

      string col = question.QuestionColumn;  
    %> 

     <li><%=question.QuestionText%> 
      <ul style="float:right;" class="MultiChoice"> 
       <li><%= Html.RadioButton(col, "1")%></li> 
       <li><%= Html.RadioButton(col, "2")%></li> 
       <li><%= Html.RadioButton(col, "3")%></li> 
      </ul> 
      <%= Html.ValidationMessage(col, "*") %> 
     </li> 
    <% } %> 

</ol> 

[Note sur le code ci-dessus:]

Chaque enquête a environ 70 questions, donc je mets le texte de la question dans une table, et le magasin les résultats dans un tableau différent. J'ai mis les questions dans mon modèle de vue de formulaire (d'où Model.Questions); la table des questions a un champ appelé QuestionColumn qui me permet de lier la colonne de la table de réponses à la question, comme montré ci-dessus (<% = Html.RadioButton (col, "1")%>, etc.)

[/ Note]

Cependant, lorsque l'utilisateur ne répond PAS à la question, la valeur 0 est insérée dans la colonne de la base de données. Je m'attendrais à Null si l'utilisateur ne sélectionne aucun des boutons radio. Par conséquent, je n'obtiens pas ce que j'attends, c'est-à-dire une erreur de validation due à la valeur nulle (pas d'entrée de l'utilisateur).

En aucun endroit j'ai stipulé une valeur par défaut de 0 pour les champs dans la table des réponses.

Alors, que se passe-t-il? Des idées?

Répondre

1

Je pense que je l'ai craqué:

Comme la table SurveyAnswers a une liste de champs non nullables (représentant d'entrée utilisateur), la classe générée par Linq sql dans le fichier dbml a des champs avec type d'octet. Par conséquent, lorsque MVC crée un nouvel objet SurveyAnswer auquel ajouter les valeurs Forms, la valeur par défaut des champs de type octet est 0. Si cette valeur n'est pas modifiée dans le formulaire, elle reste à 0 et cette valeur est égale à 0. est ce qui est envoyé à la base de données. Je m'attendais à zéro. Nicholas peut aussi avoir raison: le navigateur renvoie une valeur de 0 quand aucun bouton radio n'est sélectionné. Vis et apprend. Je vais vérifier le message de Nicholas comme réponse.

Pour résoudre ce problème, je fais ce qui suit:

Rédaction d'une contrainte de vérification pour chaque champ SurveyAnswers (il y a plus de 70 d'entre eux ...) qui limite l'entrée à (nameField> 0 ET nameField < 4). De cette façon, je garantis que seules les données valides entrent dans les enquêtes. En conséquence de ces contraintes de vérification, la mise à jour de la base de données initiée dans l'action Controller for POST échoue et, dans le bloc catch, je peux ajouter un message de validation à ModelState et revenir à l'entrée View.

+0

@awrigley - bonne solution de contournement! –

0

Comme vous ne l'avez pas mis l'un de vos boutons par défaut cochée le navigateur peut être fournit sa propre valeur - dans ce cas 0.

Selon w3.org auteurs doivent veiller à ce que dans chaque série de boutons radio que l'on est d'abord « sur »

+0

Merci, cela semble probable, mais je vais continuer à vous donner la tique, car nous n'avons pas encore de certitude. Des suggestions sur une stratégie alternative? Le questionnaire doit ressembler à sa version imprimée (boutons radio). Curieux: est-ce la même chose pour les listes déroulantes? Certains navigateurs (Chrome) laissent vide si aucune pré-sélection, d'autres (IE), mettent un 0. Cela répondrait à un problème que j'ai vu! – awrigley

Questions connexes