Плагин jQuery Validation: отключить проверку для указанных кнопок отправки

167

У меня есть форма с несколькими полями, которые я проверяю (некоторые с методами, добавленными для пользовательской проверки) с отличным плагином JQuery Validation от Jörn Zaeffere. Как вы обходите проверку с помощью указанных элементов управления отправкой (другими словами, проверку запуска с одними входами отправки, но не проверку с другими)? Это будет похоже на ValidationGroups со стандартными элементами управления валидатора ASP.NET.

Моя ситуация:

Это с ASP.NET WebForms, но вы можете игнорировать это, если хотите. Тем не менее, я использую проверку больше как «рекомендацию»: другими словами, когда форма отправляется, проверка запускается, но вместо «требуемого» сообщения отображается «рекомендация», которая говорит что-то вроде «вы». пропустил следующие поля .... вы хотите продолжить? " В этот момент в контейнере ошибок есть еще одна видимая кнопка отправки, которую можно нажать, чтобы игнорировать проверку и отправлять в любом случае. Как обойти формы .validate () для этой кнопки управления и до сих пор публиковать?

Образец «Купи и продай дом» по адресу http://jquery.bassistance.de/validate/demo/multipart/ позволяет сделать это, чтобы перейти по предыдущим ссылкам, но он делает это путем создания пользовательских методов и добавления их в валидатор. Я бы предпочел не создавать собственные методы, дублирующие функциональность, уже в плагине проверки.

Ниже приведена сокращенная версия непосредственно применимого сценария, который я получил прямо сейчас:

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'
}); 
Тед
источник
Кроме того, укажите ключевое слово возвращения на кнопке, чтобы она не будет уйдет technote.in/TechNote/Forums/AspnetReply.aspx?post_id=134

Ответы:

286

Вы можете добавить класс CSS cancelк кнопке отправки, чтобы подавить проверку

например

<input class="cancel" type="submit" value="Save" />

Смотрите документацию по этой функции в jQuery Validator: Пропуск проверки при отправке


РЕДАКТИРОВАТЬ :

Вышеуказанная техника устарела и заменена formnovalidateатрибутом.

<input formnovalidate="formnovalidate" type="submit" value="Save" />
Красный квадрат
источник
1
Это работает с <input />? Я добавил class = "cancel", и он не работает. Я использую MVC2 с MicrosoftMvcValidation. Спасибо.
VinnyG
4
@VinnyG - не используется MicrosoftMvcValidation (и никогда не будет) - это не то же самое, что jquery validate.
красный квадрат
1
Можно ли добиться того же поведения без элемента ввода? т.е. могу ли я как-то инициировать (задокументированным способом, в отличие от ответа Лепе) отправку формы и пропустить проверку одновременно?
Иван
10
Примечание: это не работает, если вы динамически добавляете класс cancel, то есть $('input[type=submit]').addClass('cancel')класс должен присутствовать при загрузке страницы.
lolesque
@lolesque, возможно, вам нужно снова вызвать метод проверки, если только они не изменили способ его работы, отметьте дату в этом ответе)
redsquare
107

Другой (недокументированный) способ сделать это, это позвонить:

$("form").validate().cancelSubmit = true;

на событие нажатия кнопки (например).

Лепе
источник
Здравствуйте @lepe, вы знаете, как повторно применить проверку jquery после записи $("form").validate().cancelSubmit = true;. Я пытался $("form").validate().cancelSubmit = false;и звонил $("form").validate();при отправке моей кнопки отправки. Спасибо
Jaikrat
3
Это можно сделать, как $(yourForm).data('validator').cancelSubmit = false;Спасибо
Джайкрат
16

Добавить атрибут formnovalidate для ввода

    <input type="submit" name="go" value="Submit"> 
    <input type="submit" formnovalidate name="cancel" value="Cancel"> 

Добавление class = "cancel" теперь устарело

Смотрите документы для пропуска проверки при отправке по этой ссылке

TastyCode
источник
10

При подключении проверки вы можете использовать опцию onsubmit: false (см. Документацию ), которая не будет проверяться при отправке формы. А затем в кнопку asp: добавьте OnClientClick = $ ('# aspnetForm'). Valid (); явно проверить, если форма действительна.

Вы можете назвать это моделью отказа вместо отказа, описанного выше.

Обратите внимание, я также использую проверку jquery с ASP.NET WebForms. Есть некоторые проблемы для навигации, но как только вы их пройдете, пользовательский опыт будет очень хорошим.

BrokeMyLegBiking
источник
3

(Расширение @lepeи @redsquareответ наASP.NET MVC + jquery.validate.unobtrusive.js)


JQuery плагин проверки (не Microsoft ненавязчивый один) позволяет поставить.cancel класс на кнопке , чтобы представить проверки объездной полностью (как показано в общепринятом ответа).

 To skip validation while still using a submit-button, add a class="cancel" to that input.

  <input type="submit" name="submit" value="Submit"/>
  <input type="submit" class="cancel" name="cancel" value="Cancel"/>

(не путайте это с type='reset' чем-то совершенно другим)

К сожалению jquery.validation.unobtrusive.js код обработки проверки (ASP.NET MVC) как бы портит поведение плагина jquery.validate по умолчанию .

Это то, что я придумал, чтобы позволить вам .cancelнажать кнопку отправки, как показано выше. Если Microsoft когда-нибудь «исправит» это, вы можете просто удалить этот код.

    // restore behavior of .cancel from jquery validate to allow submit button 
    // to automatically bypass all jquery validation
    $(document).on('click', 'input[type=image].cancel,input[type=submit].cancel', function (evt)
    {
        // find parent form, cancel validation and submit it
        // cancelSubmit just prevents jQuery validation from kicking in
        $(this).closest('form').data("validator").cancelSubmit = true;
        $(this).closest('form').submit();
        return false;
    });

Примечание. Если при первой попытке окажется, что это не работает - убедитесь, что вы не обращаетесь к серверу и не видите страницу, созданную сервером, с ошибками. Вам нужно будет обойти проверку на стороне сервера некоторыми другими способами - это просто позволяет отправлять форму на стороне клиента без ошибок (альтернативой будет добавление .ignoreатрибутов ко всему в вашей форме).

(Примечание: вам может потребоваться добавить buttonв селектор, если вы используете кнопки для отправки)

Simon_Weaver
источник
это 4 часа болтаться за чертову Pay with PayPalкнопку отправки
болтовни за чертову Simon_Weaver
Это не работает для меня с шаблоном MVC 5 по умолчанию. У меня есть пакеты Nuget JQuery 1.10.2, JQuery Validation 1.11.1, Microsoft jQuery Unobtrusive Validation 3.0.0. Что сработало для меня, так это заменив две строки в вашем коде на: $(this).closest('form').data("validator", null).unbind().submit();Это установит валидатор в null и отменит его. После этого он отправит форму. Вы можете сбросить проверку по этой строке:$.validator.unobtrusive.parse($("#YourUniqueFormId"));
Ральф Янсен
где-то вдоль линии это было исправлено. Я был в состоянии полностью прокомментировать это, и теперь это работает с .cancelклассом. примечание: если вы используете кнопку отправки type = 'image', то.cancel класс не будет работать , если не изменить , ":submit"чтобы ":submit,:image"в Jquery оригинальный плагин проверки
Simon_Weaver
2
$("form").validate().settings.ignore = "*";

Или

$("form").validate().cancelSubmit = true;

Но без успеха в кастомах требуется валидатор. Для динамического вызова отправки я создал поддельную скрытую кнопку отправки с этим кодом:

var btn = form.children('input.cancel.fakeSubmitFormButton');
if (btn.length === 0) {
    btn = $('<input name="FakeCancelSubmitButton" class="cancel fakeSubmitFormButton hide" type="submit" formnovalidate value="FakeCancelSubmitButton" />');
    form.append(btn);
}
btn.click();

Теперь пропустите проверку правильно :)

Давиде Чармелло
источник
Если вы хотите просто исключить из проверки определенный класс, вы можете использовать его вместо звездочки. $("form").validate().settings.ignore = "class-name";
Джеймс Полус
1

Этот вопрос старый, но я нашел другой способ его использования $('#formId')[0].submit() элемент dom вместо объекта jQuery, что позволяет обойти любые проверки правильности. Эта кнопка отправляет родительскую форму, которая содержит ввод.

<input type='button' value='SubmitWithoutValidation' onclick='$(this).closest('form')[0].submit()'/>

Кроме того, убедитесь, что у вас нет inputназванного «submit», или оно переопределяет названную функцию submit.

bradlis7
источник
1

Я обнаружил, что наиболее гибкий способ - использовать JQuery:

event.preventDefault():

Например, если вместо отправки я хочу перенаправить, я могу сделать:

$("#redirectButton").click(function( event ) {
    event.preventDefault();
    window.location.href='http://www.skip-submit.com';
});

или я могу отправить данные в другую конечную точку (например, если я хочу изменить действие):

$("#saveButton").click(function( event ) {
    event.preventDefault();
    var postData = $('#myForm').serialize();
    var jqxhr = $.post('http://www.another-end-point.com', postData ,function() {
    }).done(function() {
        alert("Data sent!");
    }).fail(function(jqXHR, textStatus, errorThrown) {
        alert("Ooops, we have an error");
    })

Как только вы сделаете 'event.preventDefault ();' вы обходите проверку.

Скотт Майерс
источник
1

У меня есть две кнопки для отправки формы, кнопка с именем сохранить и выйти обходит проверку:

$('.save_exist').on('click', function (event) {
            $('#MyformID').removeData('validator');
            $('.form-control').removeClass('error');
            $('.form-control').removeClass('required');                
            $("#loanApplication").validate().cancelSubmit = true;
            $('#loanApplication').submit();
            event.preventDefault();
});
Bugfixer
источник
0

Вот самая простая версия, надеюсь, она кому-нибудь поможет,

$('#cancel-button').click(function() {
    var $form = $(this).closest('form');
    $form.find('*[data-validation]').attr('data-validation', null);
    $form.get(0).submit();
});
Люси
источник
0
<button type="submit" formnovalidate="formnovalidate">submit</button>

также работает

user3024034
источник