1

我有一個包含其根據一個單選按鈕是否被選中或不使用的CustomValidator的用戶控制(有幾種單選按鈕,我只顯示有關的一個)用戶控制與客戶端+服務器端的CustomValidation;錯客戶端驗證被拾取

<asp:RadioButton runat="Server" ID="RadioBetween" GroupName="DateGroup" CssClass="date_group_options_control_radio" /> 
<asp:TextBox ID="FromDate" runat="server" Columns="8"></asp:TextBox> 
<asp:TextBox ID="ToDate" runat="server" Columns="8"></asp:TextBox> 

<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic" ClientValidationFunction="ValidateDateFields_Client" OnServerValidate="ValidateDateFields"></asp:CustomValidator> 

有一些客戶端+服務器端驗證代碼(服務器端代碼不完全一樣的東西,並跳過了簡潔)

<script type="text/javascript"> 
function ValidateDateFields_Client(source, args) 
{ 
    if ("<%=EnableValidation%>" == "True") 
    { 
     var bRadioBetweenSelected = false; 

     var oRadio = document.getElementById('<%=RadioBetween.ClientID%>'); 
     if (oRadio != null && (oRadio.checked == true || oRadio["checked"] == true)) 
     { 
      bRadioBetweenSelected = true; 
     } 

     if (bRadioBetweenSelected) 
     { 
      var oFromDate = document.getElementById('<%=FromDate.ClientID%>'); 
      var oToDate = document.getElementById('<%=ToDate.ClientID%>'); 

      if (oFromDate != null && oToDate != null) 
      { 
       var sFromDate = oFromDate.value; 
       var sToDate = oToDate.value; 

       source.innerHTML = ValidateFromToDate(sFromDate, sToDate, args); 

       if (!args.IsValid) 
       { 
        return; 
       } 
      } 
      else 
      { 
       args.IsValid = true; 
      } 
     } 
     else 
     { 
      args.IsValid = true; 
     } 
    } 
} 
</script> 

有此控制在頁面的兩個實例。當運行客戶端版本時,它會碰到錯誤的版本(被禁用的控制版本)。您可以從生成的HTML中看到兩者都被正確指定。我不確定.NET如何確定哪個客戶端函數要調用,因爲它們都具有相同的名稱。

<script type="text/javascript"> 
//<![CDATA[ 
var ctl00_MCPH1_QueryTextValidator = document.all ? document.all["ctl00_MCPH1_QueryTextValidator"] : document.getElementById("ctl00_MCPH1_QueryTextValidator"); 
ctl00_MCPH1_QueryTextValidator.controltovalidate = "ctl00_MCPH1_SearchTextBox"; 
ctl00_MCPH1_QueryTextValidator.focusOnError = "t"; 
ctl00_MCPH1_QueryTextValidator.display = "Dynamic"; 
ctl00_MCPH1_QueryTextValidator.evaluationfunction = "CustomValidatorEvaluateIsValid"; 
ctl00_MCPH1_QueryTextValidator.clientvalidationfunction = "ValidateQueryText_Client"; 
ctl00_MCPH1_QueryTextValidator.validateemptytext = "true"; 
var ctl00_MCPH1_DisplayOptionsControl1_DateValidator = document.all ? document.all["ctl00_MCPH1_DisplayOptionsControl1_DateValidator"] : document.getElementById("ctl00_MCPH1_DisplayOptionsControl1_DateValidator"); 
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.display = "Dynamic"; 
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid"; 
ctl00_MCPH1_DisplayOptionsControl1_DateValidator.clientvalidationfunction = "ValidateDateFields_Client"; 
var ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator = document.all ? document.all["ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator"] : document.getElementById("ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator"); 
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.display = "Dynamic"; 
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.evaluationfunction = "CustomValidatorEvaluateIsValid"; 
ctl00_MCPH1_PreferencesControl1_PreferencesTabContainer_DisplayOptionsTab_DisplayOptionsControl_DateValidator.clientvalidationfunction = "ValidateDateFields_Client"; 
//]]> 
</script> 

我需要添加一些東西在範圍內嗎?達到此目的的最佳方式是什麼?如果我禁用加載的第二個控件一切正常。

回答

1

您的客戶端驗證功能是爲您的用戶控件生成相同的名稱。在你的頁面中會有兩個ValidateDateFields_Client()函數,當然解釋器只會調用其中的一個。

之一來解決這個問題的方法是將生成唯一的函數名稱:

<script type="text/javascript"> 
function ValidateDateFields_Client_<%=RadioBetween.ClientID%>(source, args) 
{ 
    // ... 
} 
</script> 


<asp:CustomValidator ID="DateValidator" runat="server" Display="Dynamic" 
    ClientValidationFunction="ValidateDateFields_Client_" 
    OnServerValidate="ValidateDateFields"></asp:CustomValidator> 


protected void Page_PreRender(object sender, EventArgs e) 
{ 
    DateValidator.ClientValidationFunction += RadioBetween.ClientID; 
} 
+0

奇怪的是,這是我想出了相同的並行解決方案。謝謝:-) – 2010-11-23 21:25:33