Domanda

Pensavo che quello che stavo cercando di fare fosse piuttosto banale, ma mi risulta in modo significativo. Ecco la situazione.

Ho due pulsanti di radio (implementati con RadButton) e un RadTextBox. Voglio controllare il client, prima di inviare il modulo che il RadTextBox non è vuoto quando viene selezionato uno dei due pulsanti di radio (diciamo il primo). Ho usato il CustomValidator e ho impostato validateEmptyText = "true" senza fortuna. L'estratto del codice è sotto:

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

Il JavaScript è di seguito:

<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>
È stato utile?

Soluzione

Dopo aver trascorso un po 'di tempo per inchiodare questo problema, sono riuscito a trovare la causa principale del problema.

Il problema è correlato alla nuova modalità di convalida discreta di .NET 4.5. Perché questo funzioni correttamente JQuery 2.0 è richiesto. Questo è standard in .NET 4.5. Tuttavia, la versione jQuery incorporata in RadControls (almeno fino alla versione 2013Q3) è v1.9.1 (vedi qui). Di conseguenza il CustomValidator non funziona più correttamente.

Ci sono due alternative a questo: ho provato solo il primo con successo:

  1. Disabilita la modalità di validazione discreta. Per fare ciò è necessario includere la seguente riga in <appSettings> sezione del web.config file:

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

    Il rovescio della medaglia: la modalità di convalida discreta è progettata per rendere SE di nuove funzionalità HTML5 al fine di eliminare il codice JavaScript generato per eseguire le validazioni, con conseguenti pagine più leggere (vedi qui). Disabilitandolo, non stai utilizzando questa funzione.

  2. Scegli di non utilizzare la versione incorporata di JQuery per RadControls (cioè v1.9.1) e utilizzare quella fornita da .NET 4.5 (IE v2.0).

    Il rovescio della medaglia: il problema qui è che i radcontrol sono stati testati usando la versione incorporata di jQuery e potresti riscontrare problemi. Per disabilitare la versione incorporata di jQuery, consultare questo link

Spero che questo aiuti la prossima persona che inciamperà su questo stesso problema.

Altri suggerimenti

È necessario chiamare manualmente la funzione validatorValidate e passare l'istanza di validatore personalizzata dall'interno di RDBTNphysical_CheckedChanged e i gestori RDBTnlegal_CheckedChanged. Ho preparato un breve esempio per te di seguito:

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

Ho appena testato il codice e sembra funzionare bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top