4

我正在使用 Recaptcha 来阻止在我的网站上发送垃圾邮件。这是 Recaptcha 的代码

<asp:Panel ID="Panel1" runat="server" style="padding:5px" BackColor="White" 
            BorderColor="#999999" BorderStyle="Solid">
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <br />
                    <recaptcha:RecaptchaControl ID="recaptcha" runat="server" 
                        PrivateKey="XXXX-HIDDEN-XXXX" 
                        PublicKey="XXXX-HIDDEN-XXXX" Theme="Red" />
                    <br />
                    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Submit" />
                    &nbsp;
                    <asp:Button ID="Button3" runat="server" Text="Cancel" />
                    &nbsp;<asp:Label ID="lblResult" runat="server" Font-Size="Medium" ForeColor="Red"></asp:Label>
                </ContentTemplate>
            </asp:UpdatePanel>



        </asp:Panel>
<asp:ModalPopupExtender ID="UpdatePanel1_ModalPopupExtender" runat="server" 
                    Enabled="True" PopupControlID="Panel1" TargetControlID="Button2" BackgroundCssClass="modalBackground" CancelControlID="Button3">
</asp:ModalPopupExtender>

代码Button1_Click

protected void Button1_Click(object sender, EventArgs e)
    {
        Page.Validate();
        if (Page.IsValid)
        {
            lblResult.Text = "All Good";
        }
        else
        {
            lblResult.Text = "The words you entered are incorrect";
        }
    }

这段代码的目的是,每当用户在 Recaptcha 中输入内容时,如果单词正确,则会显示“All Good”,如果不正确,则会显示“The words you enter are wrong”。

但问题是当我点击时Button1,它的Click事件没有被执行。但是当没有加载recaptcha(即没有连接互联网时)时,Button1_Click()只执行和执行条件之外的代码if(Page.isValid)。例如,如果我像这样修改点击事件:

protected void Button1_Click(object sender, EventArgs e)
    {
        lblResult.Text="Not in if condition";
        Page.Validate();

        if (Page.IsValid)
        {
            lblResult.Text = "All Good";
        }
        else
        {
            lblResult.Text = "The words you entered are incorrect";
        }
    }

然后它成功地将 设置lblResult.Text"Not in if condition"。但是当加载 Recaptcha 时,它甚至不会执行那些超出If条件的行。

我试图解决的问题:

  1. 删除更新面板:同样的问题
  2. 在实际域上测试:同样的问题
  3. 已调试并检查任何异常:输出>调试屏幕上未显示异常

请告诉我此问题的任何其他解决方案及其发生的原因。

4

2 回答 2

2

我也遇到了同样的问题,不要用控件,直接用api;IE:

标记:

<div>
    <asp:Literal ID="litResult" runat="server" Mode="Encode" />
    <script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=<%= RecaptchaPublicKey %>">
    </script>
    <asp:Button ID="btnSubmit" OnClick="btnSubmit_Click" Text="Submit" runat="server" />
</div>

后面的代码:

private const string RECAPTCHA_CHALLENGE_FIELD = "recaptcha_challenge_field";
private const string RECAPTCHA_RESPONSE_FIELD = "recaptcha_response_field";

protected string RecaptchaPublicKey {
  get { return ConfigurationManager.AppSettings["RecaptchaPublicKey"]; }
}

protected void btnSubmit_Click(object sender, EventArgs e) {
  var validator = new Recaptcha.RecaptchaValidator {
    PrivateKey = ConfigurationManager.AppSettings["RecaptchaPrivateKey"],
    RemoteIP = Request.UserHostAddress,
    Challenge = Context.Request.Form[RECAPTCHA_CHALLENGE_FIELD],
    Response = Context.Request.Form[RECAPTCHA_RESPONSE_FIELD]        
  };
  if (validator.Validate().IsValid) {
    litResult.Text = "All Good";
  } else {
    litResult.Text = "The words you entered are incorrect";
  }
}
于 2013-06-11T11:38:29.223 回答
0

Wasn't working for me either - maybe because I had ValidationGroup set, maybe not. I fixed it by forcing it to validate and then checking if it's valid on post-back:

recaptcha.Validate();

if (recaptcha.IsValid) { /* ...do stuff... */ }
于 2015-03-10T20:48:15.250 回答