2012-04-10 106 views
52

我试图阻止我的表单提交,如果验证失败。我试着按照这previous post,但我不为我工作。我错过了什么?停止提交表单,使用Jquery

<input id="saveButton" type="submit" value="Save" /> 
<input id="cancelButton" type="button" value="Cancel" /> 
<script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> 
<script type="text/javascript"> 

    $(document).ready(function() { 
     $("form").submit(function (e) { 
      $.ajax({ 
       url: '@Url.Action("HasJobInProgress", "ClientChoices")/', 
       data: { id: '@Model.ClientId' }, 
       success: function (data) { 
        showMsg(data, e); 
       }, 
       cache: false 
      }); 
     }); 
    }); 
    $("#cancelButton").click(function() { 
     window.location = '@Url.Action("list", "default", new { clientId = Model.ClientId })'; 
    }); 
    $("[type=text]").focus(function() { 
     $(this).select(); 
    }); 
    function showMsg(hasCurrentJob, sender) { 
     if (hasCurrentJob == "True") { 
      alert("The current clients has a job in progress. No changes can be saved until current job completes"); 
      if (sender != null) { 
       sender.preventDefault(); 
      } 
      return false; 
     } 
    } 

</script> 
+0

其功能在上面的代码是从提交停止形式?什么是showMsg函数在做什么?你为什么使用sender.preventDefault();发件人参数是一个事件吗? preventDefault()用于在单击事件时停止元素的正常行为。 – DG3 2012-04-10 16:25:46

+0

发件人指的是e:事件 – 2012-04-10 16:34:17

回答

100

此外,AJAX是异步的。所以showMsg函数只有在服务器成功响应后才会被调用。并且表单提交事件不会等到AJAX成功。

e.preventDefault();作为点击处理程序中的第一行。

$("form").submit(function (e) { 
     e.preventDefault(); // this will prevent from submitting the form. 
     ... 

请参见下面的代码,

我想这是允许的HasJobInProgress ==假

$(document).ready(function() { 
    $("form").submit(function (e) { 
     e.preventDefault(); //prevent default form submit 
     $.ajax({ 
      url: '@Url.Action("HasJobInProgress", "ClientChoices")/', 
      data: { id: '@Model.ClientId' }, 
      success: function (data) { 
       showMsg(data); 
      }, 
      cache: false 
     }); 
    }); 
}); 
$("#cancelButton").click(function() { 
    window.location = '@Url.Action("list", "default", new { clientId = Model.ClientId })'; 
}); 
$("[type=text]").focus(function() { 
    $(this).select(); 
}); 
function showMsg(hasCurrentJob) { 
    if (hasCurrentJob == "True") { 
     alert("The current clients has a job in progress. No changes can be saved until current job completes"); 
     return false; 
    } else { 
     $("form").unbind('submit').submit(); 
    } 
} 
+0

这不会阻止它在所有情况下吗? – 2012-04-10 16:29:52

+0

您希望事件被允许的条件。您可能需要阻止其提交,然后等待AJAX​​响应并手动提交。 – 2012-04-10 16:30:46

+0

我想让它被允许HasJobInProgress == False – 2012-04-10 16:32:47

3

尝试下面的代码。 e.preventDefault()增加了。这将删除窗体的默认事件操作。

$(document).ready(function() { 
    $("form").submit(function (e) { 
     $.ajax({ 
      url: '@Url.Action("HasJobInProgress", "ClientChoices")/', 
      data: { id: '@Model.ClientId' }, 
      success: function (data) { 
       showMsg(data, e); 
      }, 
      cache: false 
     }); 
     e.preventDefault(); 
    }); 
}); 

另外,你提到你希望表单在验证的前提下不提交,但我在这里看不到代码验证?

下面是一些添加了验证

$(document).ready(function() { 
    $("form").submit(function (e) { 
     /* put your form field(s) you want to validate here, this checks if your input field of choice is blank */ 
    if(!$('#inputID').val()){ 
     e.preventDefault(); // This will prevent the form submission 
    } else{ 
     // In the event all validations pass. THEN process AJAX request. 
     $.ajax({ 
      url: '@Url.Action("HasJobInProgress", "ClientChoices")/', 
      data: { id: '@Model.ClientId' }, 
      success: function (data) { 
       showMsg(data, e); 
      }, 
      cache: false 
     }); 
    } 


    }); 
}); 
+0

我实际上并没有验证一个领域。代码的这个ajax部分调用一个方法来检查客户端的作业是否已经在进行中。我不希望允许同一客户端的多个作业入队。 – 2012-04-10 16:39:36

+0

e.preventDefault()然后将解决您的问题 - > – Downpour046 2012-04-10 16:40:50

15

使用的示例这个太:

if(e.preventDefault) 
    e.preventDefault(); 
else 
    e.returnValue = false; 

Becoz e.preventDefault()不支持IE(一些版本)。在IE中它是e.returnValue =假

+9

万一您使用jQuery,您可以安全地使用'e.preventDefault()'。 jQuery会照顾X浏览器的兼容性。 – staabm 2014-03-11 10:00:44

+0

酷,不知道 – gskema 2015-02-10 23:21:25

+0

从[jQuery on](http://api.jquery。com/on /)API:“从事件处理函数返回false将自动调用'event.stopPropagation()'和'event.preventDefault()'。”它继续说:“一个'false'值也可以作为'function(){return false;}'' – Paul 2015-08-21 19:01:15

3

一种不同的方法可以是

<script type="text/javascript"> 
    function CheckData() { 
    //you may want to check something here and based on that wanna return true and false from the   function. 
    if(MyStuffIsokay) 
    return true;//will cause form to postback to server. 
    else 
     return false;//will cause form Not to postback to server 
    } 
    </script> 
    @using (Html.BeginForm("SaveEmployee", "Employees", FormMethod.Post, new { id = "EmployeeDetailsForm" })) 
    { 
    ......... 
    ......... 
    ......... 
    ......... 
    <input type="submit" value= "Save Employee" onclick="return CheckData();"/> 
    }