代码之家  ›  专栏  ›  技术社区  ›  Aaron

asp.net+jquery+jquery验证插件+updatepanel+nyromodal-每个字段都成功触发!

  •  3
  • Aaron  · 技术社区  · 16 年前

    我有一个表单,其中包含用户用价格(数字)填充的输入字段列表。我已经将它们的CSS类设置为“必需”和“数字”,以便jquery验证插件相应地验证它们。所有这些都很好地工作。当每个字段不是数字或缺少值等时,将显示错误。

    整个表单实际上在一个nyromodal(jquery插件)模型弹出窗口中。但这不重要,不管怎样,它只是一个.aspx Web表单。在这个过程中,我还使用了一个updatepanel并将所有内容都放在它里面,因为我的表单本质上是一个两阶段的过程。用户必须在表单的第一个“页面”上完成一些基本步骤。当验证和工作时,我只隐藏/显示updatepanel中的一些元素,向用户显示表单的下一个“页面”,即上面描述的所有价格文本框输入字段。

    我正在使用ImageButton作为验证表单的触发点。默认情况下,如果您只保留一个imagebutton的原样,.net将触发一个回发,在我的例子中是ajax回发,因为它都发生在一个updatepanel中。这也是需要的。我不想要一个丑陋的完整的回邮,原因很明显。

    在大量阅读之后,我需要一种方法以javascript的形式附加到.NET的pageRequestManager,以便在.NET想要进行回发时拦截,这取决于jquery是否成功验证了表单。所以我的逻辑是:默认情况下,不允许回发,但是当jquery成功地验证表单时,设置一个变量,该变量表示现在允许回发,那么下次回发尝试发生时,它将通过。从而向用户显示成功。

    这是一种很好的工作方式,但还有一个最后的问题。

    jquery验证插件的validate(success)选项似乎在每个字段(而不是整个表单)验证成功后错误触发。也就是说,如果我在任何一个价格输入字段中输入一个数字,这个成功选项将触发并将cancelPostback变量设置为false,这意味着表单现在提交,即使它还没有被验证,仅仅因为一个字段是有效的。我希望这个validate(success)选项只在整个表单被验证后触发。

    我是否错误地解释了这一点,事实上,这是在做它的本意? 如果是这样的话,我怎样才能简单地将cancelPostback变量设置为true,只在整个表单被验证的时候?

    感谢大家的洞察和关注。

    我的jquery代码用于实现验证并拦截.NET回发事件,如下所示:

    <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>
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   tvanfosson    16 年前

    我建议查看SubmitHandler和InvalidHandler选项。一个或另一个应该为你想要的工作。我认为,最好的方法是在默认情况下允许回发,并在invalidHandler中将cancelPostback设置为true。或者,您可以编写自己的SubmitHandler,直接调用uDoPostback并通过ImageButton替换提交内容。

        2
  •  3
  •   Jacob Tabak    15 年前

    我对您的解决方案有问题,因为除了IE之外,所有浏览器都在jquery验证器的submitHandler()函数之前启动了“oneachRequest”函数。我想出了一个更优雅的解决方案,如果验证失败,只需取消回发,而不依赖于预设变量。

      Sys.Application.add_init(function() {
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_initializeRequest(onEachRequest);
      }); 
    
      function onEachRequest(sender, args) {
        if (args.get_postBackElement().id == <%= [YourSubmitButton].ClientID %>) {
          args.set_cancel(!$('#aspnetForm').valid());
        }
      }
    
        3
  •  1
  •   Aaron    16 年前

    感谢Heaps Tvanfosson及时提供帮助。

    OK更新:

    我跟踪了越来越多的链接,最终找到了“成功”的文档。插件主页上的文档很糟糕,忽略了许多关键功能:)但是在官方jquery页面上,它的“更好”。“成功”选项意味着每次成功验证单个字段时都会触发。所以这是按设计工作的,我错误地假设它只会在整个表单有效时触发。

    我试过你的无效处理方法。我喜欢这个主意。我遇到的一个问题是,ImageButton的回发仍然会首先触发,因此它会在InvalidHandler代码运行之前开始回发。所以回发仍将继续进行,然后,invalidHandler将禁用未来的回发,不幸的是,它们以错误的顺序触发。但除此之外,它还显示出其他一切迹象表明它是完美的解决方案。

    然后我用另一种方法去尝试服从者的方法,即相反的方法。再次,这遭受了一些订单问题,因为回发会再次被触发,但被阻止,然后提交者会允许以后回发,但已经太晚了,所以这个回发被错过了。你得再按两次按钮才能启动。

    所以最后一个半蹩脚的解决方案是:

    我把这行改为: //将客户端验证附加到主窗体 $(“<%=form1.clientID%>”).validate(submithandler:function()preventPostback=false;uuDoPostback('updatepanel1','';”);

    如您所见,首先切换preventpostback变量,然后手动触发一个新的postback,因为第一个postback可能已经被阻止并关闭。因此,本手册的dopostback调用确保了新的回发会按照preventpostback的新值被触发。

    我从ImageButtons后面删除了事件方法,并在服务器端代码中创建了一个名为“doPostBackLogic()”的新方法,该方法仅在回发页面时调用,我知道这一定是来自此验证逻辑,因为这是在我的窗体上唯一可能发生的回发。然后所有的隐藏/显示/保存逻辑都会在这里为我发生。这意味着当我手动调用uuDoPostback时,我只需使用更新面板的ID,而不用担心模仿特定的ImageButton等。

    这样它就完美地工作了。默认情况下禁用回发,当表单有效时,允许回发,但随后手动触发回发,以使新值生效。

    所以这基本上是您的第二个解决方案,再次感谢您的聆听和分享!:)