Pregunta

Pensé que lo que estaba tratando de hacer era bastante trivial, pero resulta molestarme significativamente. Aquí está la situación.

Tengo dos botones de radio (implementados con RadButton) y un RadTextBox. Quiero verificar el cliente, antes de enviar el formulario que el RadTextBox no está vacío cuando se selecciona uno de los dos botones de radio (digamos el primero). He usado CustomValidator y he establecido validateEmptyText = "verdadero" sin suerte. El extracto del código está a continuación:

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

El JavaScript está a continuación:

<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>
¿Fue útil?

Solución

Después de pasar un tiempo para clavar este problema, logré encontrar la causa raíz del problema.

El problema está relacionado con el nuevo modo de validación discreto de .NET 4.5. Para que esto funcione correctamente jQuery 2.0. Esto es estándar en .NET 4.5. Sin embargo, la versión jQuery integrada en RadControls (hasta al menos la versión 2013Q3) es V1.9.1 (ver aquí). Como resultado el CustomValidator ya no funciona correctamente.

Hay dos alternativas a esto: solo he probado la primera con éxito:

  1. Deshabilite el modo de validación discreto. Para hacer esto, debe incluir la siguiente línea en el <appSettings> Sección de la web.config expediente:

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

    La desventaja: el modo de validación discreto está diseñado para hacer SE de nuevas funciones de HTML5 para eliminar el código JavaScript generado para realizar las validaciones, lo que resulta en páginas más ligeras (ver aquí). Al deshabilitarlo, no está utilizando esta función.

  2. Elija no usar la versión incrustada de jQuery para radcontrols (es decir, v1.9.1) y use la proporcionada por .NET 4.5 (es decir, v2.0).

    La desventaja: el problema aquí es que los radcontrols se han probado utilizando la versión integrada de jQuery y puede tener problemas. Para deshabilitar la versión incrustada de jQuery, consulte este enlace

Espero que esto ayude a la próxima persona que se tope con este mismo problema.

Otros consejos

Debe llamar manualmente la función ValidatorValidate y pasar la instancia de validador personalizado desde los manejadores rdbtnphysical_checkedchanged y rdbtnlegal_checkedchanged. He preparado un breve ejemplo para ti a continuación:

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

Acabo de probar el código y parece funcionar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top