9

Sto utilizzando jQuery Validation Plugin, v1.11.0,2/4/2013 con jquery.validate.unobtrusive.js.La convalida dell'intervallo numerico non funziona correttamente in jquery.validate.unobtrusive.js

Immagino di dover affrontare un errore di convalida Intervallo per campo numerico: la convalida confronta il valore Stringa con Stringa di Min e Stringa di Max, invece di confrontare Numero di campo con numero min e numero massimo.

Repro-fasi:

Si imposta intervallo di convalida 1-1000, utilizzando seguente codice HTML:

<input name="Data.MaxConcurrentInstances" class="text-box single-line" id="Data_MaxConcurrentInstances" type="number" value="" data-val-number="The field Max concurrent instances must be a number." data-val="true" data-val-range-min="1" data-val-range-max="1000" data-val-range="The field Max concurrent instances must be between 1 and 1000."> 

si imposta il valore del campo di prova: 7.

attesi risultati: convalida completata. Nessun errore

Risultati effettivi: la convalida non riesce. Motivo interno: fallisce perché in ordine alfabetico la stringa "7" segue la stringa "1" e "1000", non tra di loro.

Domanda: È noto questo bug? Qual è la soluzione migliore per questo?

risposta

7

vedo anche questo problema. Ho appena confermato che è stato corretto nell'aggiornamento JQuery Validation 1.11.1 aggiornando il mio codice manualmente. L'aggiornamento non è ancora stato pubblicato sui repository NuGET.

È possibile scaricare l'aggiornamento da qui: indirizzi http://bassistance.de/jquery-plugins/jquery-plugin-validation/

La Microsoft CDN sono:

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js


Aggiornamento dal 3 Aprile:

l'aggiornamento del pacchetto NuGET è ora disponibile. Se esegui l'aggiornamento a JQuery Validation 1.11.1 tramite NuGET, il problema verrà risolto.

+0

Grazie per le informazioni. l'hai effettivamente testato? Perché ho visto altri thread, le persone dicevano che questo era stato risolto qualche tempo fa per le versioni precedenti, ma non lo era. Inoltre ci sono delle informazioni quando NuGet sarà aggiornato? –

+0

Ciao. Sì, l'ho effettivamente testato sulla mia applicazione. Ho avuto un sacco di convalide di intervallo e tutte loro in caso di rottura. Sostituisco semplicemente il contenuto del file JS (originariamente installato da NuGET) con la versione più recente (copia e incolla) e ora tutte le mie pagine si stanno comportando. Il pacchetto NuGET è già stato rilasciato ora. – Iravanchi

+0

Ho appena aggiornato la convalida JQuery in Gestione NuGet per i miei progetti e ora la convalida dell'intervallo funziona correttamente. –

1

Finora la soluzione migliore che ho trovato è in esecuzione l'applicazione di patch avviare script:

$(document).ready(function() { 
    window.setTimeout(function() { 
     //Fixing jquery Unobtrusive validation range integer bug 
     var allRules = $.data(document.forms[0], "validator").settings.rules; 
     for (var ruleName in allRules) { 
      var rule = allRules[ruleName]; 

      if (rule.range != undefined && rule.number) 
       for (var ri = rule.range.length-1; ri >=0 ; ri--) { 
        rule.range[ri] = Number(rule.range[ri]); 
       } 
     } 
    }, 100); 
}); 
+0

Ho lo stesso identico problema. Il work-around sopra funziona, ma ha un bug secondario nel ciclo for/next. Sostituisci la riga 9 con: "for (var ri = rule.range.length - 1; ri> = 0; ri--) {". Ho aggiornato, ma la modifica deve essere approvata dalla peer review. – Pando

+0

Puoi spiegare perché suggerisci di elencare in ordine inverso? –

+0

Per prestazioni migliori, non si desidera valutare la lunghezza della matrice in ogni iterazione. Ci sono un paio di modi diversi per farlo. Controlla http://www.openjs.com/articles/for_loop.php – Pando

0

Una soluzione alternativa sarebbe ridefinire il metodo gamma di jquery validatore come segue:

$.validator.methods.range = function (value, element, param) { 
     return this.optional(element) || (Number(value) >= Number(param[0]) && Number(value) <= Number(param[1])); 
    } 

Il codice effettivo per intervallo nel plugin validatore è

range : function (value, element, param) { 
      return this.optional(element) || (value >= param[0] && value <= param[1]); 
     } 

sulla conversione del tipo String valore nel tipo value, param[0] and param[1] in Numero utilizzando Number(value), Number(param[0]) and Number(param[1]) un confronto corretto si verifica tra Numero e non tra String.

Problemi correlati