2009-09-18 148 views
0

我使用MVC和jQuery验证xVal。这一切都很好,直到我到我的自定义验证器,做一个Ajax调用。XVal,JQuery Validate和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; 
    } 

}

当我与萤火虫步,RES是示出作为未定义。我认为这是问题所在。

我花了4小时重新安排和更改此代码,没有任何东西似乎使它正常工作。

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

+0

您可能想查看xVal。它使用你的域验证规则在你的视图中生成jQuery验证脚本(它也是服务器端验证)。 HTTP://blog.codeville。net/2009/09/17/xval-v10-now-available/ – jrummell 2009-09-18 20:25:46

+0

这个函数被xVal调用以与自定义的服务器端验证属性对应:) – Patricia 2009-09-22 13:56:18

+0

好的。我发现新版本的xVal(1.0)有一个远程规则类型。你可以在史蒂夫的博客上阅读所有关于它的内容:http://blog.codeville.net/2009/09/17/xval-v10-now-available/ 它解决了我的问题。 – Patricia 2009-10-02 20:30:11

回答

1

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

我最近写了一个blog article about remote client-side validation(正是你想要实现的),展示了如何用异步请求来完成这个任务。

+0

感谢linK!这看起来像是一个更好的解决方案,然后让浏览器等待。更加用户友好。我现在要尝试实施它! – Patricia 2009-10-02 14:08:10

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(); 
      } 
     }  
    });  
} 
+0

如果它不被xVal使用,它会很好的工作,但它需要返回true/false为xVal – Patricia 2009-09-22 14:09:06

2

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

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

我认为这可能实际上是一条路。 B/C我需要从这个函数返回true或false为xVal使用它。而zulrang的解决方案不能允许这样做。 – Patricia 2009-09-22 14:08:26

0

有点迟了,但我所能说的是避免ajax表单验证 - 它创建了一个糟糕的用户体验。 这样想一下,如果你的表单中有50个字段,并且你需要一个交互式验证体验,那么每当用户完成一个字段时,你的脚本就会打电话给你的服务器。 打开Firebug并看看,不要感到震惊。

+0

是的,有50个字段在服务器上验证显然是一个坏主意,但唯一的用户名检查或类似风格需要击中服务器。 – Patricia 2011-06-03 12:22:30