2009-10-26 3 views
2

У меня есть recaptchavalidator, который находится внутри UpdatePanel:Проблема с recaptchacontrol внутри UpdatePanel

 <asp:updatepanel runat=server id=updatepanel1> 

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

я уверен, что некоторые из вас может догадаться, что происходит. Для тех из вас, кто не испытывал этого раньше, отвлекающий контроль исчезает! Я попытался перенаправить на ту же страницу, если recaptchacontrol возвращает ложную проверку, но это привело к сложному кодовому шифрованию и потере veiwstate. Есть ли простое решение? Я просмотрел некоторые статьи в Интернете, но они кажутся сложными и недостаточно структурированными. Мне нужно изменить содержимое панели обновления, поэтому имейте это в виду.

Благодарим за помощь.

+0

Это то, что работает для меня. Не может быть лучшим решением, но стоит сделать это: http://lakhlaniprashant.blogspot.com/2009/05/recaptchanet-control-in-updatepanel.html – User

+0

Поцарапайте этот последний комментарий .. это не полное решение. – User

ответ

0

Попробуйте это.

<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-за

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

Когда я делаю это я получаю: 'неперехваченного TypeError: Невозможно установить свойство 'innerHTML' нулевого recaptcha.js: 110 Recaptcha._set_challenge recaptcha.js: 110 Recaptcha.finish_reload recaptcha.js: 110 (анонимная функция)' – User

4

Я получил это хорошо работать только с одним 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> 

Ключ должны иметь ваш UpdatePanel набор условных вокруг вашей кнопки поста, так что вы вручную вызвать обновление, чтобы перезагрузить управление ReCaptcha со стороны сервера.

Затем вы вызываете .update() на свою панель после того, как вы попросите перезагрузить();

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

Просто комментарий, я обнаружил, что 'recaptcha.reload()' должен быть с верхним регистром R, то есть 'Recaptcha.reload()'. – Kosmosniks

+1

Это решение работает для меня. благодаря –

2

Вот ответ, который я попробовал и работает:

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

В основном это предполагает создание скрытый DIV и с помощью JQuery для повторной визуализации HTML. Кроме того, сообщение в блоге дает небольшое небольшое разбиение типичных решений (например, использование RegisterClientScriptBlock с простой перезагрузкой) и почему они терпят неудачу.

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

код позади:

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