2010-06-23 22 views
12

Tengo un código donde necesito dos validadores de campo requeridos por separado para un control, ambos en grupos de validación separados que luego son validados por dos botones separados.¿Cómo puedo desactivar el comportamiento de "pérdida de foco" del validador de campo requerido de ASP.NET

Este enfoque funciona bien cuando se hace clic en los botones pero se muestran ambos validadores si ingreso un valor en el cuadro de texto y luego lo quito.

¿Hay alguna manera de desactivar esta validación de "foco perdido"? Solo necesito que valide cuando se hace clic en los botones.

EDITAR

Por desgracia, si fijo EnableClientScript = false entonces no tengo ninguna notificación cliente. Lo que quiero es mostrar el mensaje de error dinámico (efectivamente en el evento OnClientClick del botón) pero no el "foco perdido" del cuadro de texto.

¿Hay alguna forma de que pueda desactivar o "desenganchar" el evento del cliente perdido?

EDITAR

Una combinación respuesta de dDejan y answeer de womp here ordenados perfectamente el problema.

Mi código final se parece a esto (para cualquier otra persona con una situación similar) ...

Javascript ...

<script type="text/javascript"> 

    $(document).ready(function() { 
     $('body').fadeIn(500); 

     //Turn off all validation = its switched on dynamically 
     $.each(Page_Validators, function(index, validator) { 
       ValidatorEnable(validator, false); 
     }); 
    }); 

    function ToggleValidators(GroupName) { 

     $.each(Page_Validators, function(index, validator) { 
      if (validator.validationGroup == GroupName) { 

       ValidatorEnable(validator, true); 

      } else { 
       ValidatorEnable(validator, false); 
      } 
     }); 
    } 

</script> 

ASPX Ejemplo de Control ...

<telerik:RadTextBox Width="196px" ID="txtFirstName" runat="server" MaxLength="50" Skin="Black"></telerik:RadTextBox> 
<asp:RequiredFieldValidator ID="valFirstName" CssClass="Validator" runat="server" EnableClientScript="true" Display="Dynamic" ErrorMessage="You must enter your first name." ControlToValidate="txtFirstName" ValidationGroup="NeededForEmail"></asp:RequiredFieldValidator> 
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" CssClass="Validator" runat="server" EnableClientScript="true" Display="Dynamic" ErrorMessage="You must enter your first name." ControlToValidate="txtFirstName" ValidationGroup="NeededForSubmit"></asp:RequiredFieldValidator> 

Código de botón ASPX ...

<asp:Button ID="btnGetConfCode" runat="server" Text="Get Confirmation Code" OnClientClick="ToggleValidators('NeededForEmail')" OnClick="btnGetConfCode_Click" Width="100%" ValidationGroup="NeededForEmail"/> 

<asp:Button ID="btnRegisterUser" runat="server" Text="Register" OnClientClick="ToggleValidators('NeededForSubmit')" OnClick="btnRegisterUser_Click" Width="100px" ValidationGroup="NeededForSubmit" /> 

Por lo tanto, ahora no hay validación hasta que el usuario haga clic en el botón "Obtener código de confirmación de correo electrónico" o en el botón "Registrarse".

Si hacen clic en el botón "Obtener correo electrónico Código de confirmación" todos los controles validar aparte de la caja de texto donde el usuario es introducir el código de validación de correo electrónico y sólo ver un mensaje de validación.

Si hacen clic en el botón "Registrar", todos los controles se validarán y solo veremos un mensaje de validación.

Si se presiona cualquiera de los botones, el usuario regresa, agrega y luego elimina algo de texto, entonces solo vemos un validador. Antes de este cambio, solía ver ambos mensajes diciendo lo mismo.

Gracias por ayuda chicos

+0

Sé que esto puede ser viejo, pero una vez que el validador se ha activado onSubmit, ¿cómo que lo apaga de nuevo el foco, por lo que el mensaje de error desaparece hasta que se haga clic en el botón enviar de nuevo? – SollyM

Respuesta

5

Puede establecer si los validadores están "activos" o no con el código del lado del cliente usando la función ValidatorEnable. Básicamente dice así

var validator = document.getElementById('<%=Validator1.ClientID%>'); 
ValidatorEnable(validator , state); //where state is boolean 

También puede desencadenar el validador para validar en algún evento (como por ejemplo el clic de los botones) utilizando la función ValidatorValidate(validator).

No estoy seguro de que funcionaría mejor para usted (activación/desactivación de los validadores o disparo personalizado de la validación) pero sugieren este artículo que le guiará en la dirección correcta

ASP.NET Validation in Depth

+0

Sé que esto podría ser viejo, pero una vez que el Validador se haya activado en Enviar, ¿cómo lo apagas de nuevo en el enfoque, para que el mensaje de error desaparezca hasta que se haga clic en el botón Enviar nuevamente? – SollyM

0

Se puede desactivar la validación de JavaScript mediante el establecimiento de EnableClientScript = "falso" que deshacerse de la validación enfoque perdido.

2

No hay forma de desengancharlos si EnableClientScript = true.

Lo que podría hacer es configurarlo en falso. A continuación, cree un método de validación de JavaScript que se invoque en el evento submit-button onClientClick.

En su método, que tendría que llamar ValidatorValidate (control) para cada control que desea validar lado del cliente

Hay un ejemplo aquí:

http://msdn.microsoft.com/en-us/library/Aa479045#aspplusvalid_clientside

0

Puede utilizar los controles de validación personalizada en su lugar y validar la entrada usando Javascript en el cliente o dentro del controlador de eventos en el servidor. Asegúrese de configurar ValidateEmptyText = "true" en los controles de validación; de lo contrario, los eventos no se activarán en un campo vacío.

0

Try para habilitar en ambos botones, haga clic en usar javascript y desactívelo en el evento de desenfoque de la caja de texto.

0
var validator = document.getElementById('<%=Validator1.ClientID%>'); 
ValidatorEnable(validator , state); 

Se está trabajando en javascript, pero cuando usamos la función Page.IsValid en el lado del servidor que crea el problema para comprobar página es válida o no.

0

Intente restablecer el evento onchange para el control de entrada.

$(document).ready(function() { 
     $("#controlid").each(function() { this.onchange = null; }) 
    }); 
0

simplemente escriba este código en page_load caso

textboxname.Attributes.Add("onblur","ValidatorOnChange(event);"); 
Cuestiones relacionadas