9

Używam jQuery Validation Plugin, v1.11.0,2/4/2013 z jquery.validate.unobtrusive.js.Sprawdzanie zakresu numerycznego nie działa poprawnie w jquery.validate.unobtrusive.js

Zgaduję, że mam do czynienia z błędem sprawdzania zasięgu dla pola numerycznego: walidacja porównuje wartość ciągu z ciągiem min i ciągiem maks. Zamiast porównywania liczby pól z liczbą min i liczbą maksymalną.

Repro-kroki:

ustawić zakres walidacji 1-1000, stosując następujący kod 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."> 

ustawić wartość pola testowego: 7.

oczekiwane rezultaty: Sprawdzanie poprawności. Bez błędów.

Rzeczywiste wyniki: Walidacja nie udaje się. Przyczyna wewnętrzna: nie powiedzie się, ponieważ alfabetycznie ciąg "7" przechodzi po ciągu "1" i "1000", a nie między nimi.

Pytanie: Czy to jest znany błąd? Jaki jest najlepszy sposób obejścia tego problemu?

Odpowiedz

7

widzę też ten problem. Właśnie potwierdziłem, że jest on naprawiony w aktualizacji JQuery Validation 1.11.1 przez aktualizację mojego kodu ręcznie. Aktualizacja nie została jeszcze opublikowana w repozytoriach NuGET.

można pobrać aktualizację stąd: adresy http://bassistance.de/jquery-plugins/jquery-plugin-validation/

Microsoft CDN to:

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


Aktualizacja z 3 kwietnia:

aktualizacja pakietu NuGET jest już dostępna. Jeśli zaktualizujesz JQuery Validation 1.11.1 przez NuGET, problem zostanie naprawiony.

+0

Dzięki za informacje. czy to naprawdę przetestowałeś? Ponieważ widziałem inne wątki, ludzie mówili, że zostało to naprawione jakiś czas temu w poprzednich wersjach, ale tak nie było. Czy są również jakieś informacje, gdy NuGet będzie aktualizowany? –

+0

Witam. Tak, faktycznie przetestowałem to na mojej aplikacji. Miałem wiele walidacji zasięgu i wszystkie z nich zostały uszkodzone. Właśnie zastępuję zawartość pliku JS (pierwotnie zainstalowaną przez NuGET) nowszą wersją (kopiowanie i wklejanie) i wszystkie moje strony zachowują się teraz. Pakiet NuGET został już wydany. – Iravanchi

+0

Właśnie zaktualizowałem sprawdzanie poprawności JQuery w menedżerze NuGet dla moich projektów, a teraz sprawdzanie poprawności zasięgu działa dobrze. –

1

Dotychczas najlepszym obejście znalazłem działa łatanie rozruchu skrypt:

$(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

Mam dokładnie ten sam problem. Powyższe obejście działa, ale ma niewielki błąd w pętli for/next. Zamień wiersz 9 na: "for (var ri = rule.range.length - 1; ri> = 0; ri--) {". Zaktualizowałem, ale zmiana musi zostać zatwierdzona przez recenzentów. – Pando

+0

Czy możesz wyjaśnić, dlaczego sugerujesz wyliczyć w odwrotnej kolejności? –

+0

Aby uzyskać lepszą wydajność, nie należy oceniać długości tablicy w każdej iteracji. Jest na to kilka sposobów. Sprawdź http://www.openjs.com/articles/for_loop.php – Pando

0

Jednym z obejścia byłoby zastąpić metodę zakresu jQuery walidator następująco:

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

Kod rzeczywista dla zakresu w wtyczce Validator jest

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

Na konwersja typu String wartość w typie value, param[0] and param[1] na numer przy użyciu Number(value), Number(param[0]) and Number(param[1]) prawidłowe porównanie występuje między liczbą, a nie między ciąg.

Powiązane problemy