2011-06-25 44 views
1

我使用.net 4與mvc 2和註釋進行驗證。我建立了一個自己的validationAttribute來檢查我的數據庫中是否存在一個電子郵件。 c#函數ismailexisting()返回正確的值,但JavaScript不能正確執行。的JavaScript/jQuery的部分看起來像這樣:.net mvc jquery clientside驗證問題

Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) { 
     return function (value, context) { 
      $.ajax({ 
       url: "/persons/ismailexisting", 
       type: "POST", 
       data: { email: value }, 
       success: function (data) { 
        //alert("success: " + data); 
        if (data == "yes") { 
         return false; 
        } 
       } 
      }) 
      return true; 
      return rule.ErrorMessage; 
     }; 
    }; 

如果電子郵件已經存在,函數ismailexisting()返回「是」,否則「不」。 如果存在電子郵件(因此數據爲「是」),則JavaScript應阻止用戶繼續,因爲他必須輸入其他電子郵件。 如果我取消註釋alert(),則數據的值是正確的。但有些東西讓JavaScript遠離我提供的正確結果。

所有其他的東西進行自定義驗證是否正確實現,因爲我已經實現了幾個其他自定義的驗證。

在此先感謝!

+0

升級到MVC3的任何機會呢? MVC中的'RemoteAttribute'完全正是你想要完成的。 – tvanfosson

回答

0

默認情況下,AJAX調用是異步的,因此您不能從回調函數返回值。在AJAX調用返回響應之前,函數已經返回true值。您可以通過在AJAX調用的選項中設置async: false來解決此問題。注意這也會阻止任何其他的javascript在等待服務器響應時在頁面上運行,因此請謹慎使用它。還要注意,回調中的回報只從該函數返回,而不是封閉的驗證器函數。設置外部作用域中捕獲的變量的值,然後從驗證程序返回該變量的值。

Sys.Mvc.ValidatorRegistry.validators["isexisting"] = function (rule) { 
    return function (value, context) { 
     var result = true; 
     $.ajax({ 
      url: "/persons/ismailexisting", 
      type: "POST", 
      async: false, // force the call to run synchronously 
      cache: false, // we probably don't want to use a cached result 
      data: { email: value }, 
      success: function (data) { 
       //alert("success: " + data); 
       if (data == "yes") { 
        // set captured value for return 
        result = false; 
       } 
      } 
     }) 
     return result; 
     //return rule.ErrorMessage; // you'll never reach this... 
    }; 
}; 
+0

非常感謝您的先生,但這仍然無法100%正確工作。如果我把'alert(result)'返回之前,它的工作原理! - 有任何想法嗎? –

+0

@Jacques - 我想我有一個錯字。它應該是'async:false'。我不確定爲什麼我認爲它是'aSync'。請參閱http://api.jquery.com/jQuery.ajax/ – tvanfosson

+0

上的文檔,現在就像一個魅力,來自德國的感謝:) –