如果元素被隐藏,则忽略.NETvalidation器(display:none)

我们经常遇到使用javascript / css隐藏的元素上的.NETvalidation器问题(即display:none)

例如(可能存在语法错误但不担心)

 ... 

使用JavaScript:

 $('#chkNewsletter').changed(function() { $(this).is(':checked') ? $('#newsletterOnly').show() : $('#newsletterOnly').hide(); }); 

如果它被隐藏,它不应该validationtxtEmail
如果隐藏了newsletterOnly,则无法提交表单,因为RequiredFieldValidator仍然有效,尽管它被隐藏:(
而你甚至看不到validation器错误消息,因为它是隐藏的

有没有办法解决?

我试图避免PostBacks改善用户体验。
我希望我可以修改.NET javascript,只有当它们可见时才能validation控件。

我把它写成一般解决方案(可以在所有.NET网站上使用)。

您只需要在提交按钮中添加OnClientClick。

 //=================================================================== // Disable .NET validators for hidden elements. Returns whether Page is now valid. // Usage: //  //=================================================================== function DisableHiddenValidators() { for (var i = 0; i < Page_Validators.length; i++) { var visible = $('#' + Page_Validators[i].controltovalidate).is(':visible'); ValidatorEnable(Page_Validators[i], visible) } return Page_ClientValidate(); } 

要使用它,只需包含上面的javascript并将类OnClientClick="DisableHiddenValidators()"到提交按钮:

  

编辑:jQuery $(submitButton).clickfunction在iPhone / Android上无效。 我稍微更改了上面的示例代码。

如果有人看到任何错误或可能的改进,请评论:)

在这种情况下使用validation组也是一个好主意。 如果您可以对validation器进行分组,则在Button上指定您需要validation哪个validation组,只validation该组中的validation器。 在这里阅读更多内容: http : //msdn.microsoft.com/en-us/library/vstudio/ms227424(v = vs.100).aspx