【问题标题】:send ajax form to web service, only after successful validation仅在成功验证后将 ajax 表单发送到 Web 服务
【发布时间】:2010-06-26 11:55:20
【问题描述】:

我的目标是创建在客户端验证的表单,并且只有当它有效时,才向 asmx Web 服务发送 ajax 调用。我设法分别做到了这两个:客户端验证和 ajax 发送到 Web 服务,我想将这两者结合起来。怎么样?..
我有这个表格(我简化了所有简单的例子):

<form id="ContactForm" runat="server">
   <label for="name">Full Name</label>
   <input type="text" name="name" id="name"/>
   <input id="submit"  type="button" />
</form>

客户端验证如下:

    $(document).ready(function() {
        $("#submit").click(function() {
            var validator = $("#ContactForm").validate({
                rules: { name: { required: true } },
                messages: { name: errName }
            }).form();
        });
    });

而 ajax 发送看起来像这样:

 $(document).ready(function() {
        $("#submit").click(function() {
          var myMailerRequest = {name: $('#name').val()};
          var data = JSON.stringify({req: myMailerRequest}); 
                $.ajax
                ({
                    type: "POST",
                    url: "ContactFormMailer.asmx/SendContactForm",                
                    data:  data,                 
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(msg) {                           
                    AjaxSucceeded(msg);                            
                 }, error: AjaxFailed
                });
        });
  });

谢谢!

【问题讨论】:

    标签: asp.net jquery web-services json


    【解决方案1】:

    您可以为此使用.valdiate()submitHandler option,它仅在提交有效 表单时执行(它有一个相反的invalidHandler),如下所示:

    $(function() {
      $("#submit").click(function() {
        var validator = $("#ContactForm").validate({
           rules: { name: { required: true } },
           messages: { name: errName },
           submitHandler: function() {
             var myMailerRequest = {name: $('#name').val()};
             var data = JSON.stringify({req: myMailerRequest}); 
             $.ajax({
                    type: "POST",
                    url: "ContactFormMailer.asmx/SendContactForm",                
                    data:  data,                 
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: AjaxSucceeded,
                    error: AjaxFailed
             });
           }    
        }).form();
      });
    });
    

    由于您没有使用this,因此它在 2 个函数中可能更具可读性,如下所示:

    $(function() {
      $("#submit").click(function() {
        var validator = $("#ContactForm").validate({
          rules: { name: { required: true } },
          messages: { name: errName },
          submitHandler: ajaxSubmit
        }).form();
      });
      function ajaxSubmit() {
        var myMailerRequest = {name: $('#name').val()};
        var data = JSON.stringify({req: myMailerRequest}); 
        $.ajax({
          type: "POST",
          url: "ContactFormMailer.asmx/SendContactForm",                
          data:  data,
          contentType: "application/json; charset=utf-8",
          dataType: "json",
          success: AjaxSucceeded,
          error: AjaxFailed
        });
      }
    });
    

    唯一的其他更改是缩短您对AjaxSuceeded 的调用(也许这无法完成,只是因为您的简化示例),但除此之外......只需从submitHandler 回调提交表单并一切就绪。

    【讨论】:

    • 感谢 nick,但我仍然有一个问题:当提交类型 = 按钮时(如这些示例中),客户端验证工作,但当有效时,submitHandler 根本没有执行。当我将提交更改为 type=submit 时,客户端验证工作,并且当有效时,submitHandler 执行,但由于某种原因,来自 web 服务的返回内容类型是 text\html 而不是预期的 json(使用 HttpFox 测试)。我该如何解决这个问题,或者,我如何从按钮类型调用 submitHandler?谢谢!
    • @eran - 如果你只有$('input[type=button]').click(function() { $(this).closest('form').submit(); }); 它应该可以工作......任何调用提交处理程序的东西。
    • @nick - 好的,一步一步的......现在 submitHandler 使用 type=button 所以现在我有最后一个问题 - 来自 web 服务的数据作为 text/html 而不是作为 json 接收。一切正常,但是,我仍然很乐意按预期获取数据(当我在没有验证的情况下执行代码时,我将其作为 json 获取)。再次感谢!
    • @eran - 什么网络服务? :) 你能发布调用这个的代码吗? contentTypedataType 必须正确设置,如下所示:contentType: "application/json; charset=utf-8", dataType: 'json'
    • @nick 现在一切正常!!问题是我在网络服务名称中有拼写错误(您可以查看我在此页面的第一篇文章中的呼叫 - ContactFormMailer.asmx)。谢谢你太棒了!
    猜你喜欢
    • 2023-03-11
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多