2010-03-31 12 views
36

Tengo un formulario ASP.NET con tres entradas de texto, una para "Teléfono de trabajo", "Teléfono de casa" y "Teléfono celular". Cada una de estas entradas de texto tiene un RequiredFieldValidator asociado. También tengo una DropDownList donde el usuario puede seleccionar el tipo de teléfono preferido.Active o desactive dinámicamente RequiredFieldValidator según el valor de DropDownList

Quiero solo requerir el campo que se selecciona en DropDownList. Por ejemplo, si el usuario selecciona "Teléfono de trabajo" de DropDownList, quiero desactivar RequiredFieldValidator para "Teléfono de casa" y "Teléfono celular", por lo que solo se requiere el campo "Teléfono de trabajo".

Tengo un método que habilita e inhabilita estos validadores según el valor de DropDownList, pero no puedo saber cuándo llamarlo. Quiero que este método se ejecute antes de que la validación tenga lugar en la página. ¿Como podría hacerlo?

+0

¿Por qué no utilizar un CustomValidator en este caso? Desactivar/encender un RequiredFieldValidator podría llevar a un problema de diseño en el futuro. Me limitaría a usarlos en campos que serán necesarios. –

+0

Gracias por la sugerencia. Terminé usando un Custom Validator. No los había usado antes, pero después de configurarlo, era mucho más poderoso. Pude agregar fácilmente otras validaciones también. – Jeremy

+0

@Jason M: Si realiza una sugerencia de CustomValidator, la aceptaré. – Jeremy

Respuesta

11

¿Por qué no utilizar un CustomValidator en este caso? Desactivar/encender un RequiredFieldValidator podría llevar a un problema de diseño en el futuro. Me limitaría a usarlos en campos que serán necesarios.

+4

No estoy de acuerdo. No puedo ver una forma de problema de diseño en el futuro. Especialmente en situaciones simples. –

+0

RequiredFieldValidator mantiene las cosas simples en la mayoría de las situaciones. – etlds

+0

CustomValidator no valida campos vacíos –

0

AlCambiar de la lista desplegable, tendrá que registrar un controlador de eventos de servidor que activa/desactiva el validador ...

HTH

+0

¿Estás hablando del evento OnSelectedIndexChanged de DropDownList? Configuré ese evento para llamar al método que habilita/deshabilita los validadores, pero el evento no se activa hasta después de la validación. En ese punto, es demasiado tarde. Necesito que se dispare antes de que ocurra la validación. – Jeremy

+0

No, se refiere al evento del cliente "onchange" –

+0

Pensándolo bien, primero mostraría la pantalla con solo el menú desplegable para la selección de preferencia. Luego, cuando el usuario haya seleccionado la preferencia, renderice un cuadro de texto con su control validador relevante en lugar de hacerlo todo en el cliente. – Sunny

39

Usted puede hacer esto con JavaScript como esto:

ValidatorEnable(RequiredFieldValidatorId, false); 

Después haga que su lista desplegable utilizar el evento onchange (me gustaría sugerir el uso de jQuery)

$("#<%=dropDownList.ClientID %>").change(function(){ 
    var val = $(this).val(); 
    var skip = null; 
    if (val == 1) 
     skip = "workPhoneValidator"; 
    else if (val == 2) 
     skip = "cellPhoneValidator"; 
    .... 

    // by popular demand... 
    var $skip = $("#" + skip)[0]; 

    if (skip != "workPhoneValidator") ValidatorEnable($skip, false); 
    if (skip != "cellPhoneValidator") ValidatorEnable($skip, false); 
    .... 
}); 
+0

¿Has probado este código? Parece una buena solución para el lado del cliente. Estaba a punto de publicar una solución del lado del servidor, pero parece que activa los validadores del lado del cliente, ¿verdad? – citronas

+0

@citronas - Sí, esto debería alternar el lado del cliente de validadores sin devoluciones – hunter

+0

¡Agradable! +1 por eso !! –

2

manera posible sería:

  • situado en el DropDownList AutoPostBack="true"
  • En el controlador SelectedIndexChanged caso de DropDownList activar/desactivar los validadores
  • Establezca en su DropDownList CausesValidation="false" para evitar que los validadores bloqueen una devolución de datos cuando cambie la entrada DropDownList.
+1

¡causevalidación perfecta! – Anicho

5

Cuando está utilizando el teléfono de su hogar, en el evento desplegable seleccionadoindexchange, haga que los validadores de campo necesarios sean invisibles.

como ..

si se selecciona HomePhone,

homephonevalidator.visible=true 
cellphonevalidator.visible=false 
workphonevalidator.visible=false 

si se selecciona el teléfono móvil,

homephonevalidator.visible=false 
cellphonevalidator.visible=true 
workphonevalidator.visible=false 

si se selecciona WorkPhone,

homephonevalidator.visible=false 
cellphonevalidator.visible=false 
workphonevalidator.visible=true 
-1

Esta es una buena manera de activar y del lado del servidor desactivar validación de control del evento jquery:

<label class="label_radio" for="Oversize" onclick="EnableDisbledValidator('show')">show textbox</label> 

<asp:TextBox ID="txtNote" runat="server" class="checkvalidation"></asp:TextBox> 

<asp:RequiredFieldValidator ID="rfvNote" runat="server" ControlToValidate="txtNote" SetFocusOnError="true" ErrorMessage="Please enter the note" Display="Dynamic" CssClass="error-tooltip"></asp:RequiredFieldValidator> 

function EnableDisbledValidator(lblShow) { 
    if (lblShow == "hide") {; 
     ValidatorEnable($('#<%=rfvNote.ClientID %>')[0], false); 

    } else { 
     ValidatorEnable($('#<%=rfvNote.ClientID %>')[0], true); 
    } 
} 
Cuestiones relacionadas