我在一个外部Javascript文件中有一些jQuery代码,它对我的控制器中的一个操作方法进行了ajax调用。外部Javascript文件中的代码如下。动作方法最终会被调用,但是它并没有被及时调用。当我在操作方法中设置一个断点时,直到单击submit按钮返回false之后才会调用它。当EmailExist函数返回" isvalid“时,isvalid是未定义的。
因此,这并不是动作方法最终被调用的问题,它只是不会被调用,无论出于什么原因,EmailExist总是返回未定义的,并且直到按钮点击返回之后,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;
}});
发布于 2009-03-21 15:37:08
看起来您希望请求是同步的。要实现这一点,您需要将请求上的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 plugin作为所有验证需求的解决方案。
https://stackoverflow.com/questions/669459
复制相似问题