web-dev-qa-db-fra.com

La validation de la plage d'annotations de données MVC ne fonctionne pas correctement

J'ai un RangeValidator sur une propriété de mon modèle pour permettre uniquement les entiers compris entre 0 et 100. J'ai une vue partielle qui affiche un formulaire pour mettre à jour la propriété via une boîte de dialogue JQuery UI. J'ai examiné la source et peut confirmer que les attributs d'annotation de données sont générés correctement. Cependant, la validation ne fonctionne pas correctement. Il effectue une sorte de validation, mais cela n'utilise pas la plage que je contemplée. Les valeurs 1, 10 et 100 ne produisent pas l'erreur. Toute autre valeur unique ou à deux chiffres produit l'erreur. Cependant, si je coussine avec des zéros, toutes les valeurs inférieures à cent sont bien.

Modèle:

public class MyModel
{
  ...
  [Required(ErrorMessage = "{0} is required")]
  [Range(typeof(int), "0", "100", 
         ErrorMessage = "{0} can only be between {1} and {2}")]
  public int Percentage { get; set; }
  ...
}

Vue partielle:

@model MyApp.Models.Partials.MyModel

<div id="myDialog" class="editModal" title="Update Percentage">
  @using (Ajax.BeginForm("UpdatePercentage", "MyController", 
                         new AjaxOptions() { HttpMethod = "Post", 
                                             OnSuccess = "onUpdateSuccess" }, 
                         new { name = "myForm" }))
  {
    @Html.ValidationSummary(null, new { style = "width:auto;max-width:22em;               
                                                 float:left;clear:both;" })    
    <div style="width:auto;float:left;clear:both;">
      <div style="width:10em;float: left;text-align:right;clear:left;">
        @Html.Label("Percentage:")
      </div>
      <div style="width:12em;margin-left:1em;float:left;clear:right;">
        @Html.TextBoxFor(m => m.Percentage)
      </div>
    </div>
    <div style="width:23em;clear:both;text-align:center;">
      <hr />
      <input type="button" value="Cancel" class="cancelModalButton" 
             data-modal="myDialog" />
      <input type="submit" value="Submit" class="submitModalButton" 
             data-modal="myDialog" data-form="myForm" />
    </div>
  }
</div>

Marquage produit:

<div id="myDialog" class="editModal" title="Update Percentage">
  <form action="/Web/MyController/UpdatePercentage?Length=3" 
        data-ajax="true" data-ajax-method="Post" data-ajax-success="onUpdateSuccess" 
        id="form2" method="post" name="myForm">
    <div class="validation-summary-valid" data-valmsg-summary="true" 
         style="width:auto;max-width:22em;float:left;clear:both;">
      <ul>
        <li style="display:none"></li>
     </ul>
    </div>
    <div style="width:auto;float:left;clear:both;margin-bottom:.75em;">
      <div style="width:10em;float: left;text-align:right;clear:left;">
        <label for="Percentage:">Percentage:</label>
      </div>
      <div style="width:12em;margin-left:1em;float:left;clear:right;">
        <input data-val="true" data-val-number="The field Percentage must be a number." 
               data-val-range="Percentage can only be between 0 and 100" 
               data-val-range-max="100" data-val-range-min="0" 
               data-val-required="Percentage is required" id="Percentage" 
               name="Percentage" type="text" value="10" />
      </div>
    </div>
    <div style="width:23em;clear:both;text-align:center;">
      <hr />
      <input type="button" value="Cancel" class="cancelModalButton" data-modal="myDialog" />
      <input type="submit" value="Submit" class="submitModalButton" data-modal="myDialog" data-form="myForm" />
    </div>
  </form>
</div>

Je vois que le type est défini sur text, et si je change mon TextBoxFor _ sur EditorFor _ _ _ number mais je vois toujours le même comportement.

19
stopher

J'ai eu ce problème exact et j'ai trouvé la solution ici . Vous devez mettre à niveau les éléments suivants:

validation JQuery (au moins 1.11.1)
[.____] Validation non obstrive de Microsoft jQuery (au moins 2.0.30116.0)
[.____] Microsoft jQuery non obstrué ajax (au moins 2.0.30116.0)

Le problème a été introduit en brisant des changements dans JQuery 1.9.1

7
Colin

Essayez [Range(0, 100)]. Supprimer ErrorMessage Complètement pour voir que vous ne rompez rien avec des supports fausses et des supports bouclés.

Si la plage pure ne fonctionne pas correctement, laissez la force (MS) être avec vous! :)

3
Display Name