0

我将 xVal 与 MVC 和 jquery 验证一起使用。一切都很好,直到我找到执行 ajax 调用的自定义验证器。

根据 firbug Net Tab,ajax 调用返回正确的值。但是出了点问题,我无法弄清楚。

这是javascript代码:

    function CheckEmail() {
    var res;
    $.ajax({
        type: "GET",
        url: "/User/CheckEmail",
        data: "email=" + $('#EmailAddress').val(),
        success: function(result) {
            res = result;
        }
    });
    if (res == "True") {
        return true;
    }
    else {
        return false;
    }

}

当我使用 firebug 时,res 显示为未定义。我认为这就是问题所在。

我花了大约 4 个小时重新安排和更改此代码,但似乎没有任何东西可以使其正常工作。

我有一个理论,它不会等到 ajax 完成才能运行 if 语句。任何人都可以确认或否认吗?

4

4 回答 4

2

Ajax 中的“A”代表异步。

发生的事情是,您的代码被这样调用:

$.ajax(...);
if (res == "True") {        
   return true;    
} else {        
   return false;    
}

然后稍后(如毫秒后)ajax 请求返回并调用:

function(result) {
   res = result;        
}

有些人会建议使 Ajax 调用异步,但这会阻止浏览器中发生任何其他事情,直到请求返回,这可能出于多种原因而变得糟糕。

最好的解决方案是将验证逻辑放在回调中,而不是放在创建和发送 Ajax 请求的函数中。

例子:

function CheckEmail() {    
    $.ajax({        
        type: "GET",        
        url: "/User/CheckEmail",        
        data: "email=" + $('#EmailAddress').val(),        
        success: function(result) {            
            if (result == "True") {
                doSomethingPositive();
            } else {
                warnUserInvalidEmail();
            }
        }    
    });    
}
于 2009-09-18T20:07:54.733 回答
2

是的,你是对的。$.ajax()默认是异步调用。您可以添加 async : false 以使其同步。

$.ajax({
    type: "GET",
    async: false,
    url: "/User/CheckEmail",
    data: "email=" + $('#EmailAddress').val(),
    success: function(result) {
        res = result;
    }
});
于 2009-09-18T20:08:26.790 回答
1

无需同步调用您的 Web 服务器。您应该尽可能避免这些,因为在等待回复期间用户的浏览器将被锁定。

我最近写了一篇关于远程客户端验证(正是您想要实现的目标)的博客文章,展示了如何使用异步请求执行此操作。

于 2009-10-01T21:43:36.183 回答
0

有点晚了,但我只能说避免 ajax 表单验证——它会造成糟糕的用户体验。这样想,如果您的表单中有 50 个字段并且您想要交互式验证体验,那么您的脚本将在每次用户完成一个字段时调用您的服务器。打开 Firebug 看看,不要惊慌。

于 2011-06-02T23:05:33.827 回答