none
Validation cases d'un type List dans le modele RRS feed

  • Question

  • Bonjour,

    je rencontre un problème sur une liste d'input (ma liste de mois).
    J'ai un formulaire pour ajouter un nombre d'heures par mois sur une année. La personne choisit l'année et remplit chaque mois.
    Lors de la validation du formulaire, au niveau du modele, j'aimerais vérifier que chaque case de ma liste est bien supérieure à 0 et inférieure à 1000 et dans le cas contraire, envoyer une erreur sur le champs en question (astérisque par exemple)

    [B]J'ai essayé le Range mais cela met une erreur au modelState sur la liste même si tout est OK.[/B]

    Vue :
    <h2>
      Actions</h2>
     <% using (Html.BeginForm("ListerHeuresTravaillees", "Calendrier", FormMethod.Post))
      { %>
     <fieldset class="fldstFormulaire">
      <legend>Actions</legend>
      <table>
       <tr>
        <td>
         Compte
        </td>
        <td>
         <% IList<itsges.Models.CompteModele> l = (IList<itsges.Models.CompteModele>)itsges.Models.CompteModele.ListeCompte();%>
         <% l.Insert(0, null); %>
         <%: Html.DropDownList("CodeCompte", new SelectList(l, "Code", "SSSystemeTiretNom"))%>
         <%: Html.ValidationMessageFor(m => m.CodeCompte)%>
        </td>
       </tr>
       <tr>
        <td>
         Année
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.Annee, new { style = "width:40px;", maxlength="4"})%>
         <%: Html.ValidationMessageFor(m => m.Annee)%>
        </td>
       </tr>
       <tr>
        <td>
         Janvier
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[0], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[0])%>
        </td>
       </tr>
       <tr>
        <td>
         Février
        </td>
        <td>
         <%: Html.TextBoxFor(m=>m.ListeH[1], new { style = "width:70px;", maxlength = "6" }) %>
         <%: Html.ValidationMessageFor(m => m.ListeH[1])%>
        </td>
       </tr>
       <tr>
        <td>
         Mars
        </td>
        <td>
         <%: Html.TextBoxFor(m=>m.ListeH[2], new { style = "width:70px;", maxlength = "6" }) %>
         <%: Html.ValidationMessageFor(m => m.ListeH[2])%>
        </td>
       </tr>
       <tr>
        <td>
         Avril
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[3], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[3])%>
        </td>
       </tr>
       <tr>
        <td>
         Mai
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[4], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[4])%>
        </td>
       </tr>
       <tr>
        <td>
         Juin
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[5], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[5])%>
        </td>
       </tr>
       <tr>
        <td>
         Juillet
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[6], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[6])%>
        </td>
       </tr>
       <tr>
        <td>
         Août
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[7], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[7])%>
        </td>
       </tr>
       <tr>
        <td>
         Septembre
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[8], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[8])%>
        </td>
       </tr>
       <tr>
        <td>
         Octobre
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[9], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[9])%>
        </td>
       </tr>
       <tr>
        <td>
         Novembre
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[10], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[10])%>
        </td>
       </tr>
       <tr>
        <td>
         Décembre
        </td>
        <td>
         <%: Html.TextBoxFor(m => m.ListeH[11], new { style = "width:70px;", maxlength = "6" })%>
         <%: Html.ValidationMessageFor(m => m.ListeH[11])%>
        </td>
       </tr>
       <tr>
        <td>
        </td>
        <td>
         <input type="submit" name="submitButton" value="Ajouter" />
         <input type="submit" name="submitButton" value="Modifier" />
         <input type="submit" name="submitButton" value="Supprimer" />
        </td>
       </tr>
      </table>
     </fieldset>
     <%} %>
    
    
    
    

    Controller

     

    public ActionResult ListerHeuresTravaillees()
      {
       return View("ListerHeuresTravaillees");
      }
    
      [HttpPost]
      public ActionResult ListerHeuresTravaillees(string submitButton, HeuresTravailleesModele h)
      {
       if (ModelState.IsValid)
       {
        switch (submitButton)
        {
         case "Ajouter":
          h.Insert();
          break;
    
         case "Modifier":
          ViewBag.message = "///TODO modification ";
          break;
         case "Supprimer":
          ViewBag.message = "/// todo supprimer";
          break;
         default:
          break;
        }
        return RedirectToAction("ListerHeuresTravaillees");
       }
       else return ListerHeuresTravaillees();
    

     

    Modele

    public class HeuresTravailleesModele
     {
      [Required(ErrorMessage = "*")]
      public string CodeCompte { get; set; }
    
      [Required(ErrorMessage = "*")]
      public int Annee { get; set; }
    
      [Required(ErrorMessage = "*")]
      //[Range(0, 1000, ErrorMessage = "Heure incorrecte")]
      public IList<double> ListeH { get; set; }<br/>}
    

    Je rencontre ce problème dans deux formulaires donc j'aimerais trouvé une solution. [I](La solution de remplacer la liste par X champs validables ne convient pas dans l'autre cas et ne me plait pas)[/I]

    Merci par avance.

    @+
    vendredi 3 juin 2011 08:24

Réponses

  • Bonjour,

    J’ai créé une application a partit de votre code et pour résoudre votre problème j’ai changé la classe HeuresTravailleesModele pour obtenir :

     

        public class HeuresTravailleesModele

        {

              [Required(ErrorMessage = "*")]

              public string CodeCompte { get; set; }

     

              [Required(ErrorMessage = "*")]

              public int Annee { get; set; }

     

              [Required(ErrorMessage = "*")]

              public IList<Values> ListeH { get; set; }

        }

     

        public class Values

        {

            [Required(ErrorMessage = "*")]

            [Range(0, 1000, ErrorMessage = "Heure incorrecte")]

            public double val {get; set;}

        }

     

    Bien sûr il faut aussi changer les lignes de votre table dans l’interface :

       <tr>

        <td>

         Janvier

        </td>

        <td>

         <%: Html.TextBoxFor(m => m.ListeH[0].val, new { style = "width:70px;", maxlength = "6" })%>

         <%: Html.ValidationMessageFor(m => m.ListeH[0].val)%>

        </td>

       </tr>

     

    J’ai testé le code et en cette situation la validation est faite pour chaque élément de votre liste.

    Pour l’autre situation avec les valeurs Nullable<int> il faudra suivre la même piste, mais le RangeAttribute ne vous aidera plus et il faudra créer un ValidationAttribute pour la classe Values qui validera les valeurs nulles aussi que certaines valeurs (entre 0 et 1000, par exemple).

    Bonne journée,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    • Marqué comme réponse Tid- mercredi 8 juin 2011 09:51
    mercredi 8 juin 2011 07:24

Toutes les réponses