170

我有一个包含多个字段的表单,我正在使用 Jörn Zaeffere 出色的 jQuery Validation 插件进行验证(有些添加了用于自定义验证的方法)。您如何规避使用指定提交控件的验证(换句话说,使用某些提交输入触发验证,但不触发其他输入验证)?这类似于具有标准 ASP.NET 验证器控件的 ValidationGroups。

我的情况:

它与 ASP.NET WebForms 一起使用,但如果您愿意,可以忽略它。但是,我更多地将验证用作“建议”:换句话说,当提交表单时,验证会触发,但不是显示“必需”消息,而是显示“建议”,其中包含“你错过了以下字段....您仍然要继续吗?” 那时,在错误容器中,现在可以看到另一个提交按钮,可以按下该按钮,它将忽略验证并提交。如何绕过此按钮控件的表单 .validate() 并仍然发布?

http://jquery.bassistance.de/validate/demo/multipart/上的 Buy and Sell a House 示例允许这样做以便点击前面的链接,但它是通过创建自定义方法并将其添加到验证器来实现的。我宁愿不必创建自定义方法来复制验证插件中已有的功能。

以下是我现在拥有的立即适用的脚本的缩短版本:

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'
}); 
4

12 回答 12

293

您可以将 CSS 类添加cancel到提交按钮以禁止验证

例如

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

在此处查看此功能的 jQuery Validator 文档:Skipping validation on submit


编辑

上述技术已被弃用并替换为formnovalidate属性。

<input formnovalidate="formnovalidate" type="submit" value="Save" />
于 2008-10-15T08:09:22.440 回答
109

其他(未记录的)方法是调用:

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

在按钮的单击事件上(例如)。

于 2010-05-21T04:07:35.700 回答
21

另一种(动态)方式:

$("form").validate().settings.ignore = "*";

要重新启用它,我们只需设置回默认值:

$("form").validate().settings.ignore = ":hidden";

来源:https ://github.com/jzaefferer/jquery-validation/issues/725#issuecomment-17601443

于 2015-07-27T23:26:32.653 回答
17

将 formnovalidate 属性添加到输入

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

添加 class="cancel" 现在已弃用

请参阅此链接上提交时跳过验证的文档

于 2015-04-13T21:09:51.200 回答
10

您可以在连接验证时使用onsubmit:false选项(请参阅文档),该选项不会在提交表单时进行验证。然后在你的 asp:button 中添加一个 OnClientClick= $('#aspnetForm').valid(); 明确检查表单是否有效。

您可以将其称为选择加入模型,而不是上述的选择退出模型。

请注意,我还在使用带有 ASP.NET WebForms 的 jquery 验证。有一些问题需要解决,但是一旦你解决了这些问题,用户体验就会非常好。

于 2009-07-28T20:48:38.783 回答
3

@lepe's 的扩展和+的@redsquare答案)ASP.NET MVCjquery.validate.unobtrusive.js


jquery 验证插件(不是微软不显眼的插件)允许您在提交按钮上放置一个.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上图所示的提交按钮的方法。如果微软曾经“修复”过这个问题,那么你可以删除这个代码。

    // 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(注意:如果您使用按钮提交,您可能需要添加到选择器)

于 2013-07-01T10:10:54.783 回答
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();

现在正确跳过验证:)

于 2018-01-18T14:16:45.703 回答
1

这个问题很老,但我发现另一种解决方法是使用$('#formId')[0].submit(),它获取 dom 元素而不是 jQuery 对象,从而绕过任何验证钩子。此按钮提交包含输入的父表单。

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

另外,请确保您没有任何input名为“提交”的 ,否则它会覆盖名为 的函数submit

于 2014-12-24T21:02:31.237 回答
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();' 你绕过验证。

于 2016-09-09T13:37:12.503 回答
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();
});
于 2017-01-31T07:36:14.850 回答
1
<button type="submit" formnovalidate="formnovalidate">submit</button>

也在工作

于 2020-07-21T08:58:50.017 回答
0

这是最简单的版本,希望对某人有所帮助,

$('#cancel-button').click(function() {
    var $form = $(this).closest('form');
    $form.find('*[data-validation]').attr('data-validation', null);
    $form.get(0).submit();
});
于 2018-11-01T19:35:50.587 回答