我有一个表单,其中包含用户用价格(数字)填充的输入字段列表。我已将他们的 css 类设置为“必需”和“数字”,以便 jQuery 验证插件相应地验证它们。所有这些都运行良好。当每个字段不是数字或缺少值等时会显示错误。
整个表单实际上位于 nyroModal(jQuery 插件)模型弹出窗口中。但这不重要,它只是一个 .aspx 网络表单。其中,我还使用了一个 UpdatePanel 并将所有内容都放入其中,因为我的表单本质上是一个 2 阶段过程。用户必须在表单的第一个“页面”上完成一些基本步骤。当验证并工作时,我只是在 UpdatePanel 中隐藏/显示一些元素,以向用户显示表单的下一个“页面”,即如上所述的所有价格文本框输入字段。
我使用 ImageButton 作为验证表单的触发点。默认情况下,如果您只保留 ImageButton 的原样,.Net 将触发回发,在我的情况下是 AJAX 回发,因为它全部发生在 UpdatePanel 中。这又是需要的。出于明显的原因,我不想要丑陋的完整回发。
经过大量阅读后,我需要一种在 javascript 中附加到 .Net 的 PageRequestManager 的方法,以便我可以根据 jQuery 是否成功验证表单来拦截 .Net 想要进行回发的时间。所以我的逻辑是:默认情况下,不允许回发,但是当 jQuery 成功验证表单时,设置一个变量表示现在允许回发,然后下次回发尝试发生时,它将通过。因此向用户显示成功。
这一切都运行得相当好,但还有一个最后一个问题。
jQuery 验证插件的 validate({success}) 选项似乎在每个单独的字段验证成功后被错误地触发,而不是整个表单。即,如果我在任何一个价格输入字段中输入一个数字,此成功选项将触发并将我的 cancelPostback 变量设置为 false,这反过来意味着表单现在提交,即使它尚未经过验证,只是因为一个字段是有效的。我本来希望这个 validate({success}) 选项只有在整个表单被验证后才会触发。
我是否错误地解释了这一点,实际上它在做它应该做的事情?如果是这样,我如何才能仅在验证整个表单时才将我的 cancelPostback 变量设置为 true?
非常感谢您提供任何见解或提醒。
我实现验证并拦截 .Net 回发事件的 jQuery 代码如下:
<script type="text/javascript">
// By default, don't allow Postback until we've successfully validated our form on the client-side.
var cancelPostback=true;
// Every single time the page loads, including every single AJAX partial postback
function pageLoad()
{
// Reset the value to say that "We don't allow Postbacks at this stage"..
cancelPostback=true;
// Attach client-side validation to the main form
$("#<%= form1.ClientID %>").validate({ success: function() { alert('validation succeeded!'); cancelPostback = false; } });
// Grab a reference to the Page Request Manager
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(onEachRequest);
alert("Page Load");
}
// Our own custom method to be attached to each new/future page request..
function onEachRequest(sender, args)
{
alert("About to cancel? " + cancelPostback);
// Check to see if we need to Cancel this Postback based on Conditional Logic within this page..
args.set_cancel(cancelPostback);
}
</script>