Question

J'ai une forme simple dans ASP.NET MVC. Je suis en train de poster ces résultats à une action de contrôleur et je reçois un comportement étrange.

Le view est une table simple HTML:

Voici une partie du formulaire HTML Vue:

 <form action="/Applications/UpdateSurvey" method="post"><table id=questionsTable class=questionsTable border=1>
<thead><tr><td>Name</td><td>Answer</td><td>Name Attribute(for debugging)</td></tr>         </thead><tbody>
 <tr>
 <td>Question 0:</td>

 <td><input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=5 >5&nbsp;&nbsp;</td>
 <td>updater.questions[0].responseIds</td>
 </tr>
 <tr>
 <td>Question 1:</td>
 <td><input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=5 >5&nbsp;&nbsp;</td>

 <td>updater.questions[1].responseIds</td>
 </tr>
 </tbody></table>

  <input type="submit" value="Save" />

 </form>

Reliure objet:

public class SurveyUpdater
{
    public Question[] questions { get; set; }
}

public class Question
{
    public int[] responseIds { get; set; }
}

Contrôleur Code d'action:

    public ActionResult UpdateSurvey(SurveyUpdater updater)
    {
        if (updater.questions == null)
        {
            //I dont understand why this is getting hit
        }
        if (updater.questions.Length != 5)
        {
            //I dont understand why this is getting hit
        }

        return View("TestSurvey");
    }

Après le test, voici mes observations:

  1. Si j'ai au moins un CheckBox sélectionné sur chacune des questions, cela fonctionne très bien et mon contrôleur updater.questions.Length == 5 et les données se fixe parfaitement.

  2. Si je ne réponds pas l'une des questions du tout, je ne reçois que un tableau aussi grand que le numéro I sauté: -1. Donc, si je ne l'ai pas répondu à la question n ° 3, je reçois un tableau dans mon action de contrôleur de 2.

  3. En utilisant la logique de # 2, si je ne réponds pas à la première question, je reçois simplement null pour updater.questions

Ce que je veux (et ce que je pensais) est que:

Je serais toujours obtenir questions avec une longueur de 5 et dans les cas où je ne l'ai pas répondre à une des questions, je voudrais simplement obtenir un tableau 0 de taille pour cette responseIds d'index.

Est-ce un bug dans le modèle ASP.NET MVC contraignant? Sinon, est-ce que je suis absent ou tout autre moyen pour obtenir le comportement souhaité que je cherche?

Était-ce utile?

La solution

Le problème, je pense, parce que quand aucune sélection sont choisis, les entrées ne sont même pas répercutés dans les paramètres de la requête. Une façon de contourner ce serait d'avoir une valeur par défaut, case cachée contenant une valeur connue que vous pouvez filtrer sélectionné initialement pour chaque question (une case à cocher « ne répond pas », si vous voulez). Cela garantirait que vous obtenez une sélection pour chaque question et qu'un paramètre de demande existe pour chaque élément du tableau.

Pensez-y du point de vue de ce qui sera réaffecté. Seuls les éléments qui ont des valeurs, ont des noms et ne sont pas désactivés sont postés. Dans le cas contraire à toutes les questions ont des valeurs, alors le nombre d'éléments réseau devrait-il créer? Au mieux, il peut deviner que le dernier élément sélectionné devrait être la taille du tableau - mais quelles valeurs faut-il utiliser pour les articles entre les deux? Le cadre ne peut pas lire votre esprit et, sans doute, ne devrait pas se fournir la valeur par défaut pour le type pourrait être raisonnable. OMI, il serait préférable de supprimer seulement la valeur et, par conséquent, forcer le développeur à fournir la valeur par défaut si on le souhaite. Cela semble être ce qui se passe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top