jQueryvalidation插件:禁用指定提交button的validation

我使用JörnZaeffere的优秀jQueryvalidation插件来validation多个字段的表单(一些用于自定义validation的方法)。 你如何避免使用指定的提交控件进行validation(换句话说,用某些提交input进行validation,但是不要与其他validation)? 这与使用标准ASP.NETvalidation器控件的ValidationGroups类似。

我的情况:

这是与ASP.NET WebForms,但你可以忽略,如果你想。 然而,我更多地将validation用作“推荐”:换句话说,当表单被提交时,validation触发,而不是显示“必需的”消息,“推荐”表示沿着“你”错过了下面的领域……你想继续吗? 在错误容器中的那一点上,还有另一个可见的提交button,可以按下,这会忽略validation并提交。 如何绕过这个button控件的forms.validate(),仍然发布?

http://jquery.bassistance.de/validate/demo/multipart/上的 “买入和卖出房屋”样本允许这样做,以便点击前面的链接,但是通过创build自定义方法并将其添加到validation程序来实现。 我宁愿不必在validation插件中创build重复function的自定义方法。

以下是我现在所用的立即适用的脚本的缩写版本:

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

你可以添加一个CSS类的cancel来提交button来禁止validation

例如

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

请参阅此function的jQuery Validator文档: 跳过validation提交


编辑

上面的技术已被弃用,并用formnovalidate属性取代。

 <input formnovalidate="formnovalidate" type="submit" value="Save" /> 

其他(无证)方式做到这一点,就是打电话给:

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

在button的点击事件上(例如)。

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

您可以将此称为选入模式,而不是上面所述的select退出模式。

请注意,我也使用ASP.NET WebForms进行jQueryvalidation。 有一些问题可以导航,但一旦你通过他们,用户体验是非常好的。

添加formnovalidate属性来input

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

现在不赞成添加class =“cancel”

请参阅此链接上提交的跳过validation的文档

又一个(dynamic的)方式:

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

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

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

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

(扩展@lepe的和@redsquare答案的ASP.NET MVC + jquery.validate.unobtrusive.js


jqueryvalidation插件 (而不是Microsoft不显眼的插件 )允许您在提交button上放置一个.cancel类以完全绕过validation(如接受的答案中所示)。

  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.jsvalidation处理(ASP.NET MVC)的代码有点麻烦了jquery.validate插件的默认行为 。

这就是我想出来的,让你把.cancel的提交button.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; }); 

注意:如果第一次尝试,看起来这是行不通的 – 确保你没有往返于服务器,看到一个服务器生成的页面有错误。 您需要通过其他方式绕过服务器端的validation – 这只是允许表单提交客户端没有错误(替代scheme将添加.ignore属性到表单中的所有内容)。

(注意:如果您使用button提交,您可能需要将button添加到select器)

这个问题是旧的,但我发现另一种方法是使用$('#formId')[0].submit() ,它获取dom元素,而不是jQuery对象,从而绕过任何validation挂钩。 该button提交包含input的父窗体。

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

此外,请确保您没有任何input名为“提交”,或覆盖名为submit的函数。

我发现最灵活的方法是使用JQuery的:

 event.preventDefault(): 

比如,如果不是提交我想redirect,我可以这样做:

 $("#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();' 你绕过validation。

我有两个表单提交button,名为保存和退出button绕过validation:

 $('.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(); });