ASP.NET MVC jQuery AJAX调用Action方法为时已晚?

我在外部Javascript文件中有一些jQuery代码,它对我在控制器中的操作方法进行ajax调用。 外部Javascript文件中的代码如下所示。 最终会调用action方法,但不会及时调用它。 当我在action方法中设置断点时,直到提交按钮单击返回false后才会调用它。 当EmailExist函数返回“isvalid”时,isvalid未定义。

所以它不是最终调用的action方法的问题,它不会因为任何原因而被调用,EmailExist总是返回undefined,并且在返回按钮单击之前不会调用MVC Action方法。 有什么想法吗?

行动方法:

[AcceptVerbs(HttpVerbs.Post)] public JsonResult EmailExist(string email) { Account account = _generalService.GetAccountByEmail(email); bool exist = false; if (account != null) exist = true; return Json(new { indb = exist }); } 

使用Javascript:

 $(document).ready(function() { $("input[type=submit]").click(function() { var valid = true; // email - check required and valid var email = $("input[name='email']"); var emailtrim = jQuery.trim(email.val()); // email exists in db ajax request if (EmailExist(emailtrim)) { valid = false; } return valid; }) function EmailExist(emailval) { var isvalid; // hit db $.ajax( { type: "POST", url: "/Account/EmailExist", data: { 'email': emailval }, success: function(result) { if (result.indb) { isvalid = true; } }, error: function(error) { alert(error); } }); return isvalid; } 

});

看起来您希望请求是同步的。 要实现此目的,您需要将请求上的async选项设置为false。 默认情况下,请求是异步的,以便在请求完成之前从ajax调用返回。 或者,您可以重写代码,以便成功回调实际上可以完成工作。 后者对于AJAX更为惯用 – 但有时可能更复杂。

 $.ajax( { type: "POST", async: false, // <- note addition url: "/Account/EmailExist", data: { 'email': emailval }, success: function(result) { if (result.indb) { isvalid = true; } }, error: function(error) { alert(error); } }); 

要么

 $("input[type=submit]").click(function() { // email - check required and valid var form = $(this).parent('form'); var email = $("input[name='email']"); var emailtrim = jQuery.trim(email.val()); SubmitIfNoEmailExists(form,emailtrim); return false; }); function SubmitIfNoEmailExists(form,emailval) { // hit db $.ajax({ type: "POST", url: "/Account/EmailExist", data: { 'email': emailval }, success: function(result) { if (!result.indb) { form.submit(); } }, error: function(error) { alert(error); } }); } 

编辑 :根据您的意见,您可能还希望使用jQuery validation插件作为所有validation需求的解决方案。