2014-02-26 41 views
1

我正在使用此JavaScript代碼以在驗證失敗後突出顯示文本框和其他控件(指定了ASP.NET驗證器)。同一控件上的多個ASP.NET驗證器 - Page_Validator.isValid始終保持爲真

<script src="_scripts/jquery-1.6.4.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     HighlightControlToValidate(); 
     $('#<%=btnSave.ClientID %>').click(function() { 
      if (typeof (Page_Validators) != "undefined") { 
       for (var i = 0; i < Page_Validators.length; i++) { 
        if (!Page_Validators[i].isvalid) { 
         $('#' + Page_Validators[i].controltovalidate).css("background", "#f3d74f"); 
        } 
        else { 
         $('#' + Page_Validators[i].controltovalidate).css("background", "white"); 
        } 
       } 
      } 
     }); 
    }); 

    function HighlightControlToValidate() { 
     if (typeof (Page_Validators) != "undefined") { 
      for (var i = 0; i < Page_Validators.length; i++) {    
       $('#' + Page_Validators[i].controltovalidate).blur(function() { 
       var validatorctrl = getValidatorUsingControl($(this).attr("ID"));        
        if (validatorctrl!= null && !validatorctrl.isvalid) { 
         $(this).css("background", "#f3d74f"); 
        } 
        else { 
         $(this).css("background", "white"); 
        } 
       }); 
      } 
     } 
    } 
    function getValidatorUsingControl(controltovalidate) {  
     var length = Page_Validators.length; 
     for (var j = 0; j < length; j++) { 
      if (Page_Validators[j].controltovalidate == controltovalidate) { 
       return Page_Validators[j]; 
      } 
     } 
     return null; 
    } 
</script> 

只要在同一個控件上沒有指定多個ASP.NET驗證程序,該腳本就可以正常工作。不幸的是,如果在同一個控件上指定了多個ASP.NET驗證器,並且驗證失敗,那麼問題控件就不會高亮顯示。

在使用Chrome開發人員工具進行調試之後,我發現在相同控件上指定多個ASP.NET驗證程序時,始終將ASP.NET驗證程序的isValid屬性設置爲「true」,即使驗證失敗。如果同一控件上的ASP.NET驗證器被簡化爲一個驗證器,則驗證失敗時,isValid屬性將設置爲「false」,因爲它應該是。

爲什麼會發生這種情況?我該如何解決這個問題?謝謝。

回答

1

如果我已經正確讀取密集代碼,您的代碼循環遍歷每個驗證器,然後獲取關聯控件的第一個驗證器。

所以一個控件可能有3個驗證器,然後對於這三個驗證器中的每一個,它將得到相同的控件,然後是該控件的第一個驗證器。

而不是使用:

getValidatorUsingControl($(this).attr("ID")) 

只需使用:

$('#' + Page_Validators[i])[0] 

其實,這是行不通的,因爲我將是超出範圍或當現場的時候有一個變化的值是模糊的,但沿着這些線做一些事情。