2009-10-26 6 views
2

J'ai un recaptchavalidator, qui est à l'intérieur d'un UpdatePanel:problème recaptchacontrol intérieur UpdatePanel

 <asp:updatepanel runat=server id=updatepanel1> 

    <cc1:recaptchacontrol runat=server publickey=.. privatekey=.. id=recaptchavalidator1/> 
<asp:button runat=server id=button1/> 
</updatepanel> 

Je suis sûr que certains d'entre vous pouvez deviner ce qui se passe. Pour ceux d'entre vous qui n'ont jamais vécu cela, le recaptchacontrol disparaît! J'ai essayé de rediriger vers la même page si le recaptchacontrol retourne une fausse validation, mais cela a entraîné un code complexe derrière, et une perte de veiwstate. Y a-t-il une solution simple à cela? J'ai regardé quelques articles sur le web, mais ils semblent complexes et mal structurés. J'ai besoin de changer le contenu du panneau de mise à jour, alors gardez cela à l'esprit.

Nous vous remercions de votre aide.

+0

C'est ce qui a fonctionné pour moi. Peut-être pas la meilleure solution, mais vaut le coup: http://lakhlaniprashant.blogspot.com/2009/05/recaptchanet-control-in-updatepanel.html – User

+0

Scratch ce dernier commentaire .. ce n'est pas une solution complète. – User

Répondre

0

Essayez ceci.

<asp:UpdatePanel ID="ContactUpdatePanel" runat="server"> 
     <ContentTemplate> 
      <p> 
       <label>Name:</label> 
       <asp:TextBox ID="txtName" runat="server" 
         CssClass="textbox"> 
       </asp:TextBox> 
      </p> 
      <p> 
       <label>Address</label> 
       <asp:TextBox ID="txtAddress" runat="server" 
         CssClass="textbox" 
         Height="50px" 
         TextMode="MultiLine"> 
       </asp:TextBox> 
      </p> 
      <p> 
       <recaptcha:RecaptchaControl ID="recaptcha" runat="server" 
           PublicKey="public key" 
           PrivateKey="private key" 
           Theme="white" /> 
      </p> 
      <p> 
       <asp:UpdatePanel ID="UpdatePanel2" runat="server" 
         ChildrenAsTriggers="false" 
         UpdateMode="Conditional"> 
        <ContentTemplate> 
         <asp:Label ID="ErrorLabel" runat="server" 
           EnableViewState="false" 
           ForeColor="Red" /> 
        </ContentTemplate> 
       </asp:UpdatePanel> 
       <p> 
       </p> 
       <p> 
        <asp:Button ID="SubmitButton" runat="server" 
         onclick="SubmitButton_Click" Text="Submit" /> 
      </p> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

code-behind

protected void SubmitButton_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     this.recaptcha.Validate(); 
     if (recaptcha.IsValid) 
     { 
      //valid form. post it 
     } 
     else 
     { 
      ErrorLabel.Text = "Invalid Captcha. Please re-enter the words."; 
      ScriptManager.RegisterClientScriptBlock(
       this.Page, 
       this.Page.GetType(), 
       "mykey", 
       "Recaptcha.reload();", 
       true); 
      UpdatePanel2.Update(); 
     } 
    } 
    catch (Exception exception) 
    { 
     Elmah.ErrorSignal.FromCurrentContext().Raise(exception); 
    } 
} 
+0

Quand je fais cela je reçois: 'Uncaught TypeError: Impossible de définir la propriété 'innerHTML' de recaptcha.js nuls: 110 Recaptcha._set_challenge recaptcha.js: 110 Recaptcha.finish_reload recaptcha.js: 110 (fonction anonyme)' – User

4

je me suis que cela fonctionne bien avec juste un UpdatePanel.

<recaptcha:RecaptchaControl Theme="white" ID="recaptcha" runat="server" PrivateKey="your_pub_key " 
                PublicKey="your_pub_key" /> 

    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
       </asp:ScriptManager> 
       <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
       <ContentTemplate> 

    <asp:Label Visible="false" ID="RecaptchaResult" runat="server" />    
    <asp:Button ID="RecaptchaButton" runat="server" Text="Submit" onclick="btnSubmit_Click" /> 

    </ContentTemplate> 
    </asp:UpdatePanel> 

La clé est d'avoir votre UpdatePanel réglé sur conditionnelle autour de votre bouton de poste, de sorte que vous appelez manuellement la mise à jour pour recharger le contrôle recaptcha du côté serveur. Puis, vous appelez .update() sur votre panneau après avoir demandé le reload();

protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      recaptcha.Validate(); 

      if (recaptcha.IsValid) 
      { 
       RecaptchaResult.Text = "Success"; 

       RecaptchaResult.Text = "You got it!"; 
       RecaptchaResult.ForeColor = System.Drawing.Color.Green; 
       RecaptchaResult.Visible = true; 
       ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "recaptcha", "recaptcha.reload();", true); 
       UpdatePanel1.Update(); 
      } 
      else 
      { 
       RecaptchaResult.Text = this.recaptcha.ErrorMessage; 
       RecaptchaResult.ForeColor = System.Drawing.Color.Red; 
       RecaptchaResult.Visible = true; 
       ScriptManager.RegisterClientScriptBlock(this.Page, this.Page.GetType(), "recaptcha", "recaptcha.reload();", true); 
       UpdatePanel1.Update(); 

      } 

     } 
+2

Juste un commentaire, j'ai trouvé que 'recaptcha.reload()' devait être avec une majuscule R ie 'Recharger.reload()'. – Kosmosniks

+1

cette solution fonctionne pour moi. Merci –

2

Voici la réponse que je l'ai essayé et travaille:

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

Fondamentalement, il consiste à créer un div caché et en utilisant jquery de réengendrer le code html. En outre, l'article du blog donne une belle petite description des solutions typiques (par exemple, en utilisant RegisterClientScriptBlock avec un simple rechargement) et pourquoi elles échouent.

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

derrière:

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