2009-09-18 28 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