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.js
validation处理(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(); });