2008-10-23 15 views
10

Estoy usando el plugin ASP.Net y el control provisto por reCAPTCHA. Puedo lograr que el control funcione correctamente si el botón de envío en el formulario web no está en un grupo de validación. No hay atributo de grupo de validación para el control reCAPTCHA.Cómo hacer que reCAPTCHA funcione con un ValidationGroup en ASP.Net (captcha)

¿Alguien ha tenido éxito con esta o cualquier otra solución para hacer que el control reCAPTCHA funcione cuando hay un grupo de validación en el formulario web?

Respuesta

4

El plug-in reCAPTCHA ASP.NET está escrito para ser compatible con ASP.NET 1.1, lo que significa que el concepto ValidationGroup (que es nuevo en ASP.NET 2.0) no es compatible. Pero el complemento viene con downloadable source code, por lo que puede modificarlo usted mismo para que sea compatible con ValidationGroup.

En ASP.NET 2.0, validators should inherit from BaseValidator e implementar IValidator, lo que significa que debe cambiar el tipo de RecaptchaControl heredar de BaseValidator en lugar de WebControl. Luego deberá modificar el código un poco para implementar todos los métodos y propiedades definidos en BaseValidator. Luego puede usar este nuevo control en su página, que ahora admite ValidationGroup.

+0

Hola bzlm. He hecho lo anterior, pero tengo dos problemas: 1) BaseValidator también requiere que implemente el método abstracto EvaluateIsValid() (volver a agregar la propiedad IsValid con esto no funciona). 2) El control reCaptcha necesita entonces que se llene la propiedad ControlToValidate. ¿Puedes ayudar con alguno de esos? Gracias. – Nick

+0

Comenté la implementación de IValidator que está dando el complemento reCAPTCHA, e inserté esa lógica en el método EvaluateIsValid(). También omití la propiedad ControlToValidate en el código ya que no parece aplicarse en este escenario. Otro punto a tener en cuenta es que debe manejar situaciones en las que validar se llama más de una vez en la página. Debe asegurarse de que en realidad no llame a la API reCAPTCHA dos veces, ya que esto invalidará el control. Espero que esto ayude. – rifferte

+1

Hola, ¿sería posible obtener un poco más de información sobre cómo hacer esto? ¿O alguien ya tiene un proyecto completo que pueden compartir? – TimS

5

Puede agregar CustomValidator, implementar OnServerValidate que validaría los datos de ReCAPTCHA. CustomValidator se puede asignar a cualquier ValidatorGroup.

+0

Buena solución. Solo necesita verificar recaptcha.IsValid en su método OnServerValidate. ¡Muy simple! – Obfuskater

2

Esto funcionó para mí ...

  1. Añadir un validador personalizado con el grupo de validación correcta.

  2. Su su llamada al método ServerValidate ..

    recaptcha.Validate(); 
    
  3. continuación, compruebe la siguiente manera antes de su procesamiento principal ...

    si (Page.IsValid & & recaptcha.IsValid) { respose .write ("válido"); }

HTH.

+1

¿No es esto esencialmente lo mismo que en esta respuesta: http://stackoverflow.com/questions/231344/how-to-make-recaptcha-work-with-a-validationgroup-in-asp-net-captcha/656888 # 656888 – bzlm

0

controles Ver ReCaptchaImage y ReCaptchaValidator que forman parte de Altairis interfaz de usuario web kit de herramientas: http://altairiswebui.codeplex.com/

Es conjunto de código abierto de componentes web, que contiene bastante decente y ASP.NET compatible con los estándares (si se puede decir que sea el autor: -) implementación de ReCaptcha for Web Forms.

7

pensamiento que acababa de ampliar los comentarios de algunos otros con algo de código de trabajo ...

<recaptcha:RecaptchaControl ID="RecaptchaControl" runat="server" /> 

<asp:CustomValidator ID="RecaptchaValidator" runat="server" OnServerValidate="RecaptchaValidator_ServerValidate" ErrorMessage="Recaptcha input invalid." ValidationGroup="SomeValidationGroup" /> 

Y código detrás ...

protected void RecaptchaValidator_ServerValidate(object sender, ServerValidateEventArgs e) 
{ 
    this.RecaptchaControl.Validate(); 
    e.IsValid = this.RecaptchaControl.IsValid; 
} 

¿Puede alguien pensar en una simple forma de hacerlo? Felicitaciones a Vidalik por las ideas sobre el uso de OnServerValidate.

+2

+1 para proporcionar código de trabajo. –

1

RemotecUk me ha servido la sugerencia sin agregar un validador personalizado.

protected void button_onclick(object sender, EventArgs e){ 
    recaptcha.Validate(); 
    if(!Page.IsValid && recaptcha.IsValid){ 
     lblError.Text = "Please check your captcha entry"; 
    } else { 
     //do your thing 
    } 
} 
1

Para hacer la validación del lado del cliente requerido y sin alterar el código fuente reCaptcha, he añadido un CustomValidator a mi forma y crearon una función JavaScript para validar el campo de texto de entrada.

<asp:CustomValidator ID="reqRecaptcha" runat="server" ClientValidationFunction="validateRecaptcha" Text="Required"></asp:CustomValidator> 

a averiguar el ID del campo de entrada generado Miré el código fuente de la página y se dio cuenta de que el campo de entrada siempre fue recaptcha_response_field. (Por favor corrígeme si estoy equivocado) Sabiendo esto, pude crear el JavaScript (usando JQuery y una función personalizada para verificar la validez de un control).

function validateRecaptcha(sender, args) { 
     args.IsValid = isFieldValid("input[id$='recaptcha_response_field']"); 
    } 

NOTA: Si los desarrolladores cambiar la salida del control de reCAPTCHA, que no sea consciente del cambio resultante en el validador aprovechar para trabajar.

+0

'isFieldValid (" entrada [id $ = 'recaptcha_response_field'] "); 'también puede ser' isFieldValid ("# recaptcha_response_field"); '. Mi referencia original es un estándar que tengo para poder crear fácilmente CustomValidators para los controles del servidor. – cbillowes

Cuestiones relacionadas