代码之家  ›  专栏  ›  技术社区  ›  Patricia

xval、jquery validate和ajax噢,天哪!

  •  0
  • Patricia  · 技术社区  · 16 年前

    我正在将XVAL与MVC和jquery validate结合使用。在我到达执行Ajax调用的自定义验证器之前,一切都很好地工作。

    根据firbug net选项卡,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 回复  |  直到 14 年前
        1
  •  1
  •   Adrian Grigore    16 年前

    不需要同步调用Web服务器。您应该尽量避免这样做,因为用户的浏览器在等待答复时会被锁定。

    我最近写了一篇 blog article about remote client-side validation (正是您试图实现的目标)演示如何使用异步请求来实现这一点。

        2
  •  2
  •   jrummell    16 年前

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

    $.ajax({
        type: "GET",
        async: false,
        url: "/User/CheckEmail",
        data: "email=" + $('#EmailAddress').val(),
        success: function(result) {
            res = result;
        }
    });
    
        3
  •  2
  •   Roger Collins    16 年前

    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();
                }
            }    
        });    
    }
    
        4
  •  0
  •   Christof Coetzee    14 年前

    有点晚了,但我只能说避免Ajax表单验证——这会带来糟糕的用户体验。 这样考虑一下,如果表单中有50个字段,并且您希望获得交互式验证体验,那么每次用户完成一个字段时,脚本都会调用您的服务器。 打开萤火虫看看,别吃惊。