2011-11-03 59 views
1

我在創建自定義不顯眼驗證方面相當新,並且遇到了一個奇怪的問題。MVC定製不顯眼驗證總是顯示消息

此驗證基本上只是檢查數據庫(通過Ajax),以查看模型和序列號組合是否已經存在。 jQuery和Ajax看起來像預期的那樣,但是我的驗證消息在我的驗證函數被調用後立即出現。

這裏是我的jQuery:

$.validator.addMethod('newserialandmodel', 
    function (value, element, parameters) { 
     var modelNumber = $('#ProductInformation_ModelNumber').val(); 
     var serialNumber = value; 

     var token = $('input[name=__RequestVerificationToken]').val(); 

     $.ajax({ 
      type: "POST", 
      url: "/ajax/getmodelandserialexists/", 
      data: ({ 
        modelNumber: modelNumber, 
        serialNumber: serialNumber, 
        '__RequestVerificationToken': token 
        }), 
      cache: true, 
      dataType: 'json', 
      success: function (response) { 
       if (response.exists) { 
        $.validator.messages.newserialandmodel = 
         $.format($.validator.messages.newserialandmodel); 
       } 

       return !response.exists; 
      } 
     }); 

     return false; 
    } 
); 

$.validator.unobtrusive.adapters.add(
    'newserialandmodel', 
    function (options) { 
     options.rules['newserialandmodel'] = options.params; 

     if (options.message != null) { 
      $.validator.messages.newserialandmodel = options.message; 
     } 
    } 
); 

這裏是表單元素是什麼樣子:

<input type="text" value="" 
name="ProductInformation.SerialNumber" id="ProductInformation_SerialNumber" 
data-val-required="The Serial number field is required." 
data-val-newserialandmodel="There is already a contract with the provided model and serial numbers." 
data-val-length-max="30" 
data-val-length="The 30 field requires no more than 30 characters." 
data-val="true" class="input-validation-error"> 

當我一步通過,只要它擊中驗證的第一線,在消息已經顯示:

已經與提供的型號和序列號簽有合同。

此外,即使函數返回true,它仍然保留消息。

函數/ Ajax的其餘部分工作得很好,我只是想知道爲什麼它會立即顯示此消息,以及爲什麼它在我返回true時停留在那裏。

任何想法是怎麼回事?

回答

1

感謝Greg和Zero的回覆,它讓我玩弄了W /返回值多一點。

問題是我的Ajax成功函數中的return只是將響應返回給成功函數,而不是驗證函數。所以我不得不改變它來在Ajax成功函數中設置一個值,並返回它。

同樣值得注意的是,我必須包含async: false,否則驗證函數將在Ajax調用完成之前返回(默認值爲false)。

$.validator.addMethod('newserialandmodel', 
    function (value, element, parameters) { 
     var modelNumber = $('#ProductInformation_ModelNumber').val(); 
     var serialNumber = value; 

     var token = $('input[name=__RequestVerificationToken]').val(); 

     var isValid = false; 

     $.ajax({ 
      type: "POST", 
      url: "/ajax/getmodelandserialexists/", 
      data: ({ 
        modelNumber: modelNumber, 
        serialNumber: serialNumber, 
        '__RequestVerificationToken': token }), 
      async: false, 
      dataType: 'json', 
      success: function (response) { 
       if (response.exists) { 
        $.validator.messages.newserialandmodel = 
         $.format($.validator.messages.newserialandmodel); 
       } 

       isValid = !response.exists; 
      } 
     }); 

     return isValid; 
    } 
); 
1

我認爲這是因爲你在函數結束時返回false。所以函數將返回false,然後success回調觸發器試圖返回true,但已經太晚了,false已經返回給驗證器。一個簡單的解決方案就是使用async: false同步進行AJAX調用。

+0

+1,因爲這導致我走下了正確的軌道。「成功」響應基本上被忽略,因爲它沒有響應驗證功能,而是成功功能。看到我的答案爲修復。 –

0

一對夫婦的猜測:

  1. 你有「緩存:真」,這意味着如果該URL是一樣的它不會從服務器獲取。我不知道緩存是否會檢查POST的參數,所以即使使用不同的參數,它也可能會使用緩存的版本。嘗試將緩存設置爲false。

  2. 我不熟悉適配器API,但以前的活動是否有可能導致條件滿足? (這個選項在執行時實際上不是null)?