2012-01-20 79 views
8

He visto un par de otras publicaciones aquí sobre el uso de Recaptcha con ASP.NET UpdatePanels, pero aún no he encontrado una respuesta que resuelva mi problema.Recaptcha desaparece durante PostBack

Aquí está mi código ASPX:

<asp:UpdatePanel ID="updRecaptcha" runat="server" UpdateMode="Always"> 
<ContentTemplate> 
    <recaptcha:RecaptchaControl ID="btnrecaptcha" runat="server" Theme="clean" PrivateKey"<%$ Resources: General, CaptchaPrivateKey %>" PublicKey="<%$ Resources: General, CaptchaPublicKey %>" />   
    <asp:Label ID="recaptchaerror" runat="server" style="color: Red;"/> 
</ContentTemplate> 
</asp:UpdatePanel> 

Así las vidas de control Reconocer texto dentro de un control de usuario que utiliza varios controles de validación .Net (por ejemplo RequiredFieldValidator). Necesito ampliar los controles Recaptcha y ASP.net antes de permitir que el proceso continúe.

Si falla alguna de las validaciones (Recaptcha o .Net), el control Recaptcha desaparece. Al observar la fuente HTML, el control no se carga en absoluto después de la devolución de datos, aunque le estoy diciendo al UpdatePanel que actualice.

No puedo volver a cargar la página por completo ya que todo esto aparece como una superposición en la parte superior de la página y hay otros campos de formulario en la página detrás.

Por favor ayuda!

Editar:

De C# cuando el Reconocer texto no estoy llamando este código:

ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "InvalidRecaptcha", "alert('Recaptcha Failed');Recaptcha.reload();alert('Recaptcha Reloaded');", true); 

Tanto de los estados de alerta de incendios, pero el Reconocer texto todavía no se carga.

+0

¿Tiene un enlace a una demostración en vivo de ello? Sospecho que no se vuelve a inicializar el javascript después de la publicación. – Aristos

+0

Desafortunadamente no uno que puedo compartir. Vi en la pestaña de la consola de Google Chrome que mostraba este error: No se puede establecer el valor de la propiedad 'innerHTML'. –

Respuesta

3

Olvidar el ScriptManager. Todo lo que necesitas es este script en la página. Cambiar en consecuencia para sus identificadores:

<script type="text/javascript"> 
// RECAPTURE CODE FOR RELOADING AFTER INCORRECT ENTRY 
if (typeof Sys != 'undefined') { 
    var requestManager = Sys.WebForms.PageRequestManager.getInstance(); 
    requestManager.add_endRequest(function(sender, args) { 

     $('<div id="recaptcha_widget_div"/>').appendTo('#recaptcha_widget_div2'); 

     if (typeof Recaptcha != 'undefined') {         
      Recaptcha.create(recaptcha_key, "recaptcha_widget_div", 
      { 
       theme: "red", 
       callback: Recaptcha.focus_response_field 
      }); 
     } 
    }); 
} 

-1

necesita volver a cargar el control reCaptcha con javascript, intente esto:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    btnrecaptcha.Validate(); 
    if(IsValid && updRecaptcha.IsValid} 
    { 
      //Some logic here 
    } 
    ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "CaptchaReload", "Recaptcha.reload();", true); 
} 
+0

Estoy haciendo algo similar: ScriptManager.RegisterClientScriptBlock (Page, Page.GetType(), "InvalidRecaptcha", "alerta ('Recaptcha Falló'); Recaptcha.reload(); alerta ('Recaptcha Reloaded');" , cierto); Ambas sentencias de alerta se disparan pero el Recaptcha aún no se carga. –

+0

Tuve que abandonar Recaptcha y usar mi propia pregunta "demostrar que eres humano" en su lugar. Sin embargo, me gustaría saber cómo resolver esto. –

6

La solución aceptada no funcionó para mí. Aquí está la respuesta que he tratado y está trabajando:

ASP.Net, disappearing Recaptcha, UpdatePanels and Partial PostBacks: Fixed once and for all

Básicamente se trata de crear un div oculto y el uso de jQuery que volver a hacer el html. Además, la publicación del blog ofrece un pequeño desglose de las soluciones típicas (por ejemplo, el uso de RegisterClientScriptBlock con una simple recarga) y el motivo por el que fallan.

<div runat="server" id="pbTarget" visible="false"></div> 
<recaptcha:RecaptchaControl ID="recaptcha" runat="server" Theme="clean" /> 

código detrás:

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    recaptcha.Validate(); 
    if (!Page.IsValid || !recaptcha.IsValid) 
    { 
    pbTarget.Visible = true; 
    ScriptManager.RegisterClientScriptBlock( 
     recaptcha, 
     recaptcha.GetType(), 
     "recaptcha", 
     "Recaptcha._init_options(RecaptchaOptions);" 
     + "if (RecaptchaOptions && \"custom\" == RecaptchaOptions.theme)" 
     + "{" 
     + " if (RecaptchaOptions.custom_theme_widget)" 
     + " {" 
     + " Recaptcha.widget = Recaptcha.$(RecaptchaOptions.custom_theme_widget);" 
     + " Recaptcha.challenge_callback();" 
     + " }" 
     + "} else {" 
     + " if (Recaptcha.widget == null || !document.getElementById(\"recaptcha_widget_div\"))" 
     + " {" 
     + " jQuery(\"#" + pbTarget.ClientID + "\").html('<div id=\"recaptcha_widget_div\" style=\"display:none\"></div>');" 
     + " Recaptcha.widget = Recaptcha.$(\"recaptcha_widget_div\");" 
     + " }" 
     + " Recaptcha.reload();" 
     + " Recaptcha.challenge_callback();" 
     + "}", 
     true 
    ); 

    return; 
    } 
    else 
    { 
    //normal page processing here... 
+0

¡Gracias! Funcionó perfectamente para mí :) –

+0

¡Gracias! Esto funcionó perfectamente. – colincameron

+0

Funcionó perfecto para mí al usar un UpdatePanel –

0

Sorprendentemente, yo no tenía necesidad de aplicar la llamada RegisterClientScriptBlock para hacer que funcione. sólo tiene que utilizar:

UpdateMode = "siempre"

para el UpdatePanel y en el lado del servidor llamo:

updatePanel.Update(); 

Esto también evita que el código de imagen se muestre un nuevo reto .

+0

Siguiendo sus instrucciones, recibí el siguiente mensaje de error: "El método de actualización solo se puede invocar en UpdatePanel con ID 'sifCaptchaControl' cuando UpdateMode se establece en Conditional." – Bryan

0

Mi respuesta es básicamente el mismo que el "Usuario" ( que trabajaron !), Sino para ayudar a cualquier persona que utilice VB. me hubiera comentado allí, pero tengo representante zippo ... (espero que esto no es demasiado de una infracción, y que ayude a alguien por)

porté la carne de este a VB.NET:

pbTarget.Visible = True 
     Dim _sb As New StringBuilder 
     With _sb 
      .Append("Recaptcha._init_options(RecaptchaOptions);") 
      .Append("if (RecaptchaOptions && ""custom"" == RecaptchaOptions.theme)") 
      .Append("{") 
      .Append(" if (RecaptchaOptions.custom_theme_widget)") 
      .Append(" {") 
      .Append(" Recaptcha.widget = Recaptcha.$(RecaptchaOptions.custom_theme_widget);") 
      .Append(" Recaptcha.challenge_callback();") 
      .Append(" }") 
      .Append("} else {") 
      .Append(" if (Recaptcha.widget == null || !document.getElementById(""recaptcha_widget_div""))") 
      .Append(" {") 
      .Append(" jQuery(""#") 
      .Append(pbTarget.ClientID) 
      .Append(""").html('<div id=""recaptcha_widget_div"" style=""display:none""></div>');") 
      .Append(" Recaptcha.widget = Recaptcha.$(""recaptcha_widget_div"");") 
      .Append(" }") 
      .Append(" Recaptcha.reload();") 
      .Append(" Recaptcha.challenge_callback();") 
      .Append("}") 
     End With 
     ScriptManager.RegisterClientScriptBlock(recaptcha, recaptcha.[GetType](), "recaptcha", _sb.ToString, True) 
3

Si está utilizando Reconocer texto 2.0 este es su Javascript

<script type="text/javascript"> 
    function CaptchaReload() { 
      Recaptcha.create("yourpublicKey", 'yourRecaptchadiv', { 
      theme: 'white', 
      callback: grecaptcha.reset() 

     }); 
     } 

ésta es su Reconocer texto Div

<div class="g-recaptcha" data-sitekey="yourPublicKey"></div> 

Entonces al final del evento de devolución llamar al Javascript

protected void txtEmail_TextChanged(object sender, EventArgs e) 
{ 
    if (txtEmail.Text != string.Empty) 
    { 
     ValidateEmail(); 
     ScriptManager.RegisterStartupScript(this, this.GetType(), "CaptchaReload", "$.getScript(\"https://www.google.com/recaptcha/api.js\", function() {});", true); 
    } 
} 
+1

Gracias Vijay. Su respuesta me condujo en la dirección correcta, excepto que en mi caso, el contenido estaba dentro de un panel de actualización de Ajax y debe usar esas referencias en la línea ScriptManager de la siguiente manera: ScriptManager.RegisterStartupScript (UpdatePanel1, UpdatePanel1.GetType(), "CaptchaReload "," $ .getScript (\ "https: //www.google.com/recaptcha/api.js \", function() {}); ", true); – Dave

0

yo era capaz de hacer que funcione utilizando la versión 2.1.0.0 de la biblioteca de reCAPTCHA para .NET con formularios web, gestor de la escritura y dentro de una panel de actualización.

primer lugar, en la página .aspx exterior del panel de actualización Estoy cargando la biblioteca de Google reCAPTCHA:

<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" 
      async defer></script> 

En segundo lugar, en la página .aspx en el interior del panel de actualización que añade un div que funcionará como el panel de destino para cargar el reCAPTCHA:

<div runat="server" id="pbTarget" visible="false"></div> 
<cc1:Recaptcha ID="recaptcha" runat="server" Theme="Clean" /> 

en tercer lugar, en el código detrás al final de mi evento de devolución me he registrado un script de inicio para hacer que el reCAPTCHA en mi panel de destino

Private Sub cmdSubmit_Click(sender As Object, e As EventArgs) Handles cmdSubmit.Click 
    pbTarget.Visible = True 
    ScriptManager.RegisterStartupScript(
     UpdatePanel1, 
     UpdatePanel1.GetType(), 
     "loadCaptcha", 
     "grecaptcha.render('" & pbTarget.ClientID & "', {'sitekey': 'YourKey' });", 
End Sub