1

I eine Benutzersteuerung aufweist, die eine CustomValidator enthält, die verwendet wird, je nachdem, ob ein RadioButton- aktiviert ist oder nicht (es gibt mehrere Radiobuttons, zeige ich nur die relevanteste)Benutzerkontrolle mit Client + Server Side CustomValidation; Falsche Client Seiten validator aufgenommen

<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> 

Es gibt einige Client + Server-Seite Validierungscode (der Server-Seite Code tut genau das gleiche und wird der Kürze halber ausgelassen)

<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> 

Es gibt zwei Instanzen dieser Steuerung in der Seite. Wenn die clientseitige Version ausgeführt wird, trifft sie die falsche (die Version des Steuerelements, die deaktiviert ist). Sie können sehen, dass aus dem generierten HTML beide richtig angegeben sind. Ich bin mir nicht sicher, wie .NET funktioniert, welche clientseitige Funktion aufgerufen wird, wenn sie beide den gleichen Namen haben.

<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> 

Muss ich etwas hinzufügen, um es zu erfassen? Was ist der beste Weg, dies zu erreichen? Wenn ich das Laden des zweiten Steuerelements deaktiviere, funktioniert alles einwandfrei.

Antwort

1

Ihre Clientüberprüfungsfunktion wird für beide Benutzersteuerelemente mit demselben Namen generiert. Es wird zweiValidateDateFields_Client() Funktionen in Ihrer Seite sein, und natürlich wird der Interpreter nur einen von ihnen aufrufen.

Ein Weg, um dieses Problem zu umgehen wäre einzigartige Funktionsnamen zu generieren:

<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

Merkwürdigerweise, das ist die gleiche Lösung, die ich mit parallel kam. Danke :-) –

+0

Ich hasse .NET manchmal (lese die meiste Zeit) –