Mam formularz z wieloma polami, które sprawdzam (niektóre z dodanymi metodami do niestandardowej walidacji) z doskonałą wtyczką Jörn Zaeffere do walidacji jQuery. W jaki sposób można obejść walidację z określonymi kontrolami przesyłania (innymi słowy, zwalidować walidację z niektórymi danymi wejściowymi przesyłania, ale nie odpalić walidacji z innymi)? Byłoby to podobne do ValidationGroups ze standardowymi kontrolkami walidatora ASP.NET.
Moja sytuacja:
Jest z ASP.NET WebForms, ale możesz to zignorować, jeśli chcesz. Jednak używam walidacji bardziej jako „rekomendacji”: innymi słowy, kiedy formularz jest przesyłany, walidacja jest uruchamiana, ale zamiast wyświetlania komunikatu „wymagany”, „zalecenie” pokazuje, że mówi coś podobnego do „ty pominięto następujące pola… czy mimo wszystko chcesz kontynuować? ” W tym momencie w kontenerze błędów widoczny jest teraz kolejny przycisk przesyłania, który można nacisnąć, który zignoruje walidację i mimo wszystko wyśle. Jak obejść formularze .validate () dla tej kontrolki przycisku i nadal publikować?
Przykład Kup i sprzedaj dom pod adresem http://jquery.bassistance.de/validate/demo/multipart/ pozwala na to, aby przejść do poprzednich linków, ale robi to poprzez utworzenie własnych metod i dodanie ich do walidatora. Wolałbym nie tworzyć własnych metod powielających funkcjonalność już we wtyczce walidacyjnej.
Poniżej znajduje się skrócona wersja skryptu do natychmiastowego zastosowania, który mam w tej chwili:
var container = $("#<%= Form.ClientID %> div.validationSuggestion");
$('#<%= Form.ClientID %>').validate({
errorContainer: container,
errorLabelContainer: $("ul",container),
rules: {
<%= YesNo.UniqueID %>: { required: true },
<%= ShortText.UniqueID %>: { required: true } // etc.
},
messages: {
<%= YesNo.UniqueID %>: 'A message.',
<%= ShortText.UniqueID %>: 'Another message.' // etc.
},
highlight: function(element, errorClass) {
$(element).addClass(errorClass);
$(element.form).find("label[for=" + element.id + "]").addClass(errorClass);
$(element.form).find("label[for=" + element.id + "]").removeClass("valid");
},
unhighlight: function(element, errorClass) {
$(element).removeClass(errorClass);
$(element.form).find("label[for=" + element.id + "]").removeClass(errorClass);
$(element.form).find("label[for=" + element.id + "]").addClass("valid");
},
wrapper: 'li'
});
źródło
Odpowiedzi:
Możesz dodać klasę CSS
cancel
do przycisku przesyłania, aby pominąć sprawdzanie poprawnościna przykład
Zobacz dokumentację jQuery Validator dla tej funkcji tutaj: Pomijanie weryfikacji podczas przesyłania
EDYCJA :
Powyższa technika została wycofana i zastąpiona
formnovalidate
atrybutem.źródło
$('input[type=submit]').addClass('cancel')
. Zajęcia muszą być obecne podczas ładowania strony.Innym (nieudokumentowanym) sposobem na to jest zadzwonienie:
na zdarzenie kliknięcia przycisku (na przykład).
źródło
$("form").validate().cancelSubmit = true;
. Próbowałem$("form").validate().cancelSubmit = false;
i wzywam$("form").validate();
do przesłania mojego przycisku przesyłania. Dzięki$(yourForm).data('validator').cancelSubmit = false;
dziękiJeszcze inny (dynamiczny) sposób:
Aby go ponownie włączyć, po prostu przywracamy domyślną wartość:
Źródło: https://github.com/jzaefferer/jquery-validation/issues/725#issuecomment-17601443
źródło
Dodaj atrybut formnovalidate do danych wejściowych
Dodawanie class = "cancel" jest teraz przestarzałe
Zobacz dokumentację Pomijanie weryfikacji po przesłaniu za pomocą tego linku
źródło
Możesz użyć opcji onsubmit: false (patrz dokumentacja ) podczas podłączania walidacji, która nie zostanie zweryfikowana po przesłaniu formularza. A następnie w swoim asp: button dodaj OnClientClick = $ ('# aspnetForm'). Valid (); wyraźnie sprawdzić, czy formularz jest ważny.
Możesz nazwać to modelem opt-in zamiast opisanego powyżej.
Uwaga: używam również walidacji jQuery z ASP.NET WebForms. Jest kilka problemów do poruszania się, ale kiedy już je przejdziesz, wrażenia użytkownika są bardzo dobre.
źródło
(Przedłużenie
@lepe
i@redsquare
odpowiedź naASP.NET MVC
+jquery.validate.unobtrusive.js
)Jquery sprawdzania poprawności plugin (nie Microsoft dyskretny jeden) pozwala umieścić
.cancel
klasę na przycisk Prześlij do zatwierdzenia obejścia całkowicie (jak pokazano w akceptowanej odpowiedzi).(nie myl tego z
type='reset'
czymś zupełnie innym)Niestety,
jquery.validation.unobtrusive.js
kod obsługi walidacji (ASP.NET MVC) nieco psuje domyślne zachowanie wtyczki jquery.validate .Oto, co wymyśliłem, aby umożliwić Ci umieszczenie
.cancel
przycisku przesyłania, jak pokazano powyżej. Jeśli Microsoft kiedykolwiek to naprawi, możesz po prostu usunąć ten kod.Uwaga: jeśli przy pierwszej próbie okaże się, że to nie działa - upewnij się, że nie przechodzisz do serwera i nie widzisz strony wygenerowanej przez serwer z błędami. Będziesz musiał ominąć walidację po stronie serwera w inny sposób - pozwala to tylko na przesłanie formularza po stronie klienta bez błędów (alternatywą byłoby dodanie
.ignore
atrybutów do wszystkiego w formularzu).(Uwaga: może być konieczne dodanie
button
do selektora, jeśli używasz przycisków do przesyłania)źródło
Pay with PayPal
$(this).closest('form').data("validator", null).unbind().submit();
To ustawi walidator na wartość null i rozwiąże go. Następnie prześle formularz. Możesz zresetować walidację w tym wierszu:$.validator.unobtrusive.parse($("#YourUniqueFormId"));
.cancel
klasą. uwaga: jeśli używasz przycisku przesyłania type = 'image',.cancel
klasa nie będzie działać, chyba że zmienisz":submit"
na":submit,:image"
w oryginalnej wtyczce do walidacji jqueryLub
Ale bez powodzenia w niestandardowym wymaganym walidatorze. Aby wywołać przesyłanie dynamicznie, utworzyłem fałszywy ukryty przycisk przesyłania z tym kodem:
Teraz pomiń poprawnie weryfikację :)
źródło
$("form").validate().settings.ignore = "class-name";
To pytanie jest stare, ale znalazłem inny sposób na jego obejście, to użycie
$('#formId')[0].submit()
, które pobiera element dom zamiast obiektu jQuery, omijając w ten sposób wszelkie zaczepy walidacyjne. Ten przycisk przesyła formularz nadrzędny, który zawiera dane wejściowe.Upewnij się również, że nie masz żadnego
input
o nazwie „submit”, w przeciwnym razie nadpisuje on funkcję o nazwiesubmit
.źródło
Odkryłem, że najbardziej elastycznym sposobem jest użycie JQuery:
Np. Jeśli zamiast przesyłać chcę przekierować, mogę:
lub mogę wysłać dane do innego punktu końcowego (np. jeśli chcę zmienić akcję):
Po wykonaniu „event.preventDefault ();” pomijasz walidację.
źródło
Mam dwa przyciski do przesyłania formularza, przycisk o nazwie zapisz i wyjdź omija walidację:
źródło
Oto najprostsza wersja, mam nadzieję, że komuś pomoże,
źródło