1

내가 RadioButton에이 선택되었는지 여부에 따라 사용되는 직접 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> 
(여러 RadioButtons를 난에만 관련을 도시하고있어, 거기)

일부 클라이언트 + 서버 측 유효성 검사 코드가 페이지에서이 컨트롤의 두 인스턴스가 있습니다

<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

는 이상하게도, 그것이 내가 병렬로 내놓았다 같은 솔루션입니다. 감사합니다 :-) –

+0

.NET 가끔 싫지만 (대부분의 시간을 읽습니다) –

관련 문제