Question

Je pensais que ce que j'essayais de faire était plutôt insignifiant, mais cela m'avait de me déranger considérablement. Voici la situation.

J'ai deux boutons radio (implémentés à l'aide de Radbutton) et un RadTextBox. Je veux vérifier le client, avant de soumettre le formulaire que le RadTextBox n'est pas vide lorsque l'un des deux boutons radio est sélectionné (disons le premier). J'ai utilisé le CustomValidator et j'ai défini valideMpTyText = "true" sans chance. L'extrait du code est ci-dessous:

<asp:Panel runat="server" ID="Panel1">
<table>
    <tr>
        <td class="auto-style5">
            <telerik:RadButton ID="rdBtnIndividual" runat="server" AutoPostBack="False" GroupName="rdEmplrType" 
                Text="Individual" ToggleType="Radio" OnClientCheckedChanged="rdBtnPhysical_CheckedChanged" 
                UseSubmitBehavior="False">
                <ToggleStates>
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadioChecked" />
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadio" />
                </ToggleStates>
            </telerik:RadButton>
        </td>
        <td>
            <telerik:RadButton ID="rdBtnLegal" runat="server" AutoPostBack="False" GroupName="rdEmplrType" Text="Legal Entity" 
                ToggleType="Radio" OnClientCheckedChanged="rdBtnLegal_CheckedChanged" UseSubmitBehavior="False">
                <ToggleStates>
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadioChecked" />
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadio" />
                </ToggleStates>
            </telerik:RadButton>
        </td>
    </tr>
    <tr>
        <td class="auto-style5">
            <label>Name:</label>
        </td>
        <td>
            <telerik:RadTextBox ID="txtName" Runat="server" EmptyMessage="Name" LabelWidth="64px" Resize="None" Width="160px" DisabledStyle-BackColor="Silver">
            </telerik:RadTextBox>
        </td>
        <td><asp:RequiredFieldValidator ID="THIS_IS_WORKING" ControlToValidate="txtName"
                runat="server" ErrorMessage="<img src='images/Exclamation.png' Title='Required Field'/>" >
            </asp:RequiredFieldValidator>
        </td>
    </tr>
    <tr>
        <td class="auto-style5">
            <label>Father's Name</label>
        </td>
        <td style="width:100px">
            <telerik:RadTextBox ID="txtFathersName" Runat="server" EmptyMessage="Father's Name" LabelWidth="64px" Resize="None" Width="160px" DisabledStyle-BackColor="Silver">
            </telerik:RadTextBox>
        </td>
        <td>
            <asp:CustomValidator runat="server" ID="NOT_WORKING_VALIDATOR" ControlToValidate="txtFathersName" ValidateEmptyText="True"
                ClientValidationFunction="RequiredIfIndividual"
                ErrorMessage="<img src='images/Exclamation.png' Title='Required Field'/>" EnableClientScript="True">
            </asp:CustomValidator>

        </td>
    </tr>
</table>
</asp:Panel>

Le javascript est ci-dessous:

<script type="text/javascript">
    function RequiredIfIndividual(sender, args) {
        var chkBoxIndividual = $find("<%=rdBtnIndividual.ClientID%>");
        chkBoxIndividual = $telerik.toButton(chkBoxIndividual);
        if (chkBoxIndividual.get_checked()) {
            if (args.Value == "") {
                args.IsValid = false;
            }
            else {
                args.IsValid = true;
            }
        } else {
            args.IsValid = true;
        }
    }

</script>
Était-ce utile?

La solution

Après avoir passé du temps pour clouer ce problème, j'ai réussi à trouver la cause profonde du problème.

Le problème est lié au nouveau mode de validation discret de .NET 4.5. Pour que cela fonctionne correctement, jQuery 2.0 est requis. Ceci est standard dans .NET 4.5. Cependant, la version jQuery intégrée dans RadControls (jusqu'au moins la version 2013Q3) est V1.9.1 (voir ici). En conséquence CustomValidator ne fonctionne plus correctement.

Il y a deux alternatives à cela - je n'ai essayé le premier avec succès:

  1. Désactiver le mode de validation discrète. Pour ce faire, vous devez inclure la ligne suivante dans le <appSettings> Section de la web.config dossier:

    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />

    L'inconvénient: le mode de validation discret est conçu pour fabriquer SE de nouvelles fonctionnalités HTML5 afin d'éliminer le code JavaScript généré afin d'effectuer les validations, ce qui entraîne des pages plus légères (voir ici). En le désactivant, vous n'utilisez pas cette fonctionnalité.

  2. Choisissez de ne pas utiliser la version intégrée de jQuery pour RadControls (c'est-à-dire v1.9.1) et utilisez celle fournie par .NET 4.5 (c'est-à-dire v2.0).

    L'inconvénient: le problème ici est que RadControls a été testé à l'aide de la version intégrée de jQuery et que vous pouvez rencontrer des problèmes. Afin de désactiver la version intégrée de jQuery, veuillez vous référer à ce lien

J'espère que cela aidera la prochaine personne qui trébuchera sur ce même problème.

Autres conseils

Vous devez appeler manuellement la fonction ValidatorValidate et passer l'instance de validateur personnalisé à l'intérieur du rdbtnphysical_checkedchanged et les gestionnaires rdbtnlegal_checkedchanged. J'ai préparé un court exemple pour vous ci-dessous:

  <script type="text/javascript">
            function RequiredIfIndividual(sender, args) {
                var chkBoxIndividual = $find("<%=rdBtnIndividual.ClientID%>");
                chkBoxIndividual = $telerik.toButton(chkBoxIndividual);
                if (chkBoxIndividual.get_checked()) {
                    if (args.Value == "") {
                        args.IsValid = false;
                    }
                    else {
                        args.IsValid = true;
                    }
                } else {
                    args.IsValid = true;
                }
            }

            function rdBtnPhysical_CheckedChanged(sender, args) {
                ValidatorValidate($get("NOT_WORKING_VALIDATOR"));
            }

            function rdBtnLegal_CheckedChanged(sender, args) {
                ValidatorValidate($get("NOT_WORKING_VALIDATOR"));
            }

        </script>

Je viens de tester le code et cela semble fonctionner correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top