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 に何かを入力するたびに、単語が正しい場合は「すべて良い」と表示され、そうでない場合は「入力した単語が正しくありません」と表示されることです。

しかし、問題は、 をクリックする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"ます。Ifただし、Recaptcha が読み込まれると、条件外の行も実行されません。

私がそれを解決しようとしたこと:

  1. 削除された更新パネル: 同じ問題
  2. 実際のドメインでテスト済み: 同じ問題
  3. デバッグおよび例外のチェック: [出力] > [デバッグ] 画面に例外は表示されませんでした

この問題の他の解決策とその理由を教えてください。

4

2 に答える 2

2

私も同じ問題を抱えていました。コントロールを使用せず、APIを直接使用してください。すなわち:

マークアップ:

<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

私にとってもうまくいきませんでした-多分私がValidationGroup設定したからかもしれませんが、そうではないかもしれません。強制的に検証してから、ポストバックで有効かどうかを確認することで修正しました。

recaptcha.Validate();

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