XVal、JQuery验证和Ajax噢,天哪!

XVal、JQuery验证和Ajax噢,天哪!,jquery,asp.net-mvc,ajax,xval,Jquery,Asp.net Mvc,Ajax,Xval,我将xVal与MVC和jquery一起使用。这一切都很好地工作,直到我得到我的自定义验证器,它执行ajax调用 根据firbug Net选项卡,ajax调用返回正确的值。但是出了点问题,我想不出来 下面是javascript代码: function CheckEmail() { var res; $.ajax({ type: "GET", url: "/User/CheckEmail", data: "email=" + $

我将xVal与MVC和jquery一起使用。这一切都很好地工作,直到我得到我的自定义验证器,它执行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语句。有人能证实或否认这一点吗?

Ajax中的“A”代表异步

$.ajax({
    type: "GET",
    async: false,
    url: "/User/CheckEmail",
    data: "email=" + $('#EmailAddress').val(),
    success: function(result) {
        res = result;
    }
});
发生的情况是,您的代码被这样调用:

$.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();
            }
        }    
    });    
}

Ajax中的“A”表示异步

$.ajax({
    type: "GET",
    async: false,
    url: "/User/CheckEmail",
    data: "email=" + $('#EmailAddress').val(),
    success: function(result) {
        res = result;
    }
});
发生的情况是,您的代码被这样调用:

$.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();
            }
        }    
    });    
}
是的,你说得对。默认情况下是异步调用。您可以添加async:false使其同步

$.ajax({
    type: "GET",
    async: false,
    url: "/User/CheckEmail",
    data: "email=" + $('#EmailAddress').val(),
    success: function(result) {
        res = result;
    }
});
是的,你说得对。默认情况下是异步调用。您可以添加async:false使其同步

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

不需要对web服务器进行同步调用。您应该尽可能避免这些,因为用户的浏览器在等待回复期间会被锁定


我最近写了一篇文章(正是您想要实现的),展示了如何通过异步请求实现这一点

不需要对web服务器进行同步调用。您应该尽可能避免这些,因为用户的浏览器在等待回复期间会被锁定


我最近写了一篇文章(正是您想要实现的),展示了如何通过异步请求实现这一点

有点晚了,但我能说的就是避免ajax表单验证——它会创造糟糕的用户体验。 这样考虑一下,如果表单中有50个字段,并且希望获得交互式验证体验,那么每次用户完成一个字段时,脚本都会调用服务器。
打开Firebug看一看,不要感到震惊。

有点晚了,但我能说的就是避免ajax表单验证——它会创造糟糕的用户体验。 这样考虑一下,如果表单中有50个字段,并且希望获得交互式验证体验,那么每次用户完成一个字段时,脚本都会调用服务器。
打开Firebug并看一看,不要感到震惊。

您可能想查看xVal。它使用域验证规则在视图中生成jQuery验证脚本(它也执行服务器端验证)。使用xVal调用此函数以与自定义服务器端验证属性相对应:)好的。我发现新版本的xVal(1.0)有一个远程规则类型。你可以在史蒂夫的博客上读到这一切:它为我解决了问题。你可能想看看xVal。它使用域验证规则在视图中生成jQuery验证脚本(它也执行服务器端验证)。使用xVal调用此函数以与自定义服务器端验证属性相对应:)好的。我发现新版本的xVal(1.0)有一个远程规则类型。你可以在史蒂夫的博客上看到这一切:它为我解决了问题。我认为这可能是真正的出路。b/c我需要从该函数返回true或false,以便xVal使用它。zulrang的解决方案不可能做到这一点。我认为这实际上可能是一条出路。b/c我需要从该函数返回true或false,以便xVal使用它。zulrang的解决方案不允许这样做。如果xVal没有使用它,这将非常有效,但需要为xVal返回true/false如果xVal没有使用它,这将非常有效,但需要为xVal返回true/false感谢链接!这看起来是比让浏览器等待更好的解决方案。更加用户友好。我现在就要尝试实现它!谢谢你的链接!这看起来是比让浏览器等待更好的解决方案。更加用户友好。我现在就要尝试实现它!是的,在服务器上有50个字段进行验证显然是个坏主意,但是需要对服务器进行唯一用户名检查或类似的样式。是的,在服务器上有50个字段进行验证显然是个坏主意,但是需要对服务器进行唯一用户名检查或类似的样式。