【问题标题】:How to make reCAPTCHA work with a ValidationGroup in ASP.Net (captcha)如何使 reCAPTCHA 与 ASP.Net 中的 ValidationGroup 一起工作(验证码)
【发布时间】:2010-09-18 21:11:02
【问题描述】:

我正在使用reCAPTCHA 提供的 ASP.Net 插件和控件。如果 web 表单上的提交按钮不在验证组中,我可以成功地使控件工作。 reCAPTCHA 控件没有验证组属性。

当 web 表单上有验证组时,是否有人在此或任何解决方案方面取得了成功,以使 reCAPTCHA 控件正常工作?

【问题讨论】:

    标签: asp.net captcha recaptcha


    【解决方案1】:

    为了在不更改 reCaptcha 源代码的情况下进行客户端所需的验证,我在表单中添加了一个 CustomValidator 并创建了一个 JavaScript 函数来验证输入文本字段。

    <asp:CustomValidator ID="reqRecaptcha" runat="server" ClientValidationFunction="validateRecaptcha" Text="Required"></asp:CustomValidator>
    

    为了找出生成的输入字段的ID,我查看了页面的源代码,发现输入字段总是recaptcha_response_field。 (如果我错了,请纠正我)知道了这一点,我能够创建 JavaScript(使用 JQuery 和自定义函数来检查控件的有效性)。

        function validateRecaptcha(sender, args) {
            args.IsValid = isFieldValid("input[id$='recaptcha_response_field']");
        }
    

    注意:如果开发人员更改了 reCaptcha 控件的输出,您可能不知道导致验证器继续工作的更改。

    【讨论】:

    • isFieldValid("input[id$='recaptcha_response_field']"); 也可以是isFieldValid("#recaptcha_response_field");。我的原始参考是我拥有的标准,因此我可以轻松地为服务器控件创建 CustomValidators。
    【解决方案2】:

    RemotecUk 的建议对我有用,而无需添加自定义验证器。

    protected void button_onclick(object sender, EventArgs e){
        recaptcha.Validate();
        if(!Page.IsValid && recaptcha.IsValid){
            lblError.Text = "Please check your captcha entry";
        } else {
            //do your thing
        }
    }
    

    【讨论】:

      【解决方案3】:

      我以为我会用一些工作代码来扩展 cmets...

      <recaptcha:RecaptchaControl ID="RecaptchaControl" runat="server" />
      
      <asp:CustomValidator ID="RecaptchaValidator" runat="server" OnServerValidate="RecaptchaValidator_ServerValidate" ErrorMessage="Recaptcha input invalid." ValidationGroup="SomeValidationGroup" />
      

      还有后面的代码……

      protected void RecaptchaValidator_ServerValidate(object sender, ServerValidateEventArgs e)
      {
          this.RecaptchaControl.Validate();
          e.IsValid = this.RecaptchaControl.IsValid;
      }
      

      谁能想到更简单的方法?感谢 Vidalik 关于使用 OnServerValidate 的想法。

      【讨论】:

        【解决方案4】:

        查看作为 Altairis Web UI 工具包一部分的 ReCaptchaImage 和 ReCaptchaValidator 控件:http://altairiswebui.codeplex.com/

        它是一组开源的 Web 组件,包含相当不错且符合 ASP.NET 标准(如果我可以说它是作者 :-) ReCaptcha for Web Forms 的实现。

        【讨论】:

          【解决方案5】:

          这对我有用...

          1. 使用正确的验证组添加自定义验证器。

          2. 它的 ServerValidate 方法调用..

            recaptcha.Validate();
            
          3. 然后在你的主要处理之前检查如下...

            if (Page.IsValid && recaptcha.IsValid) { respose.write("有效"); }

          HTH。

          【讨论】:

          【解决方案6】:

          您可以添加 CustomValidator,实现将验证 ReCAPTCHA 数据的 OnServerValidate。 CustomValidator 可以分配给任何 ValidatorGroup。

          【讨论】:

          • 不错的解决方案。您只需要在 OnServerValidate 方法中检查 recaptcha.IsValid 即可。很简单!
          【解决方案7】:

          reCAPTCHA ASP.NET 插件被编写为向后兼容 ASP.NET 1.1,这意味着不支持 ValidationGroup 概念(这是 ASP.NET 2.0 中的新概念)。但是插件自带downloadable source code,所以可以自己修改支持ValidationGroup

          在 ASP.NET 2.0 中,validators should inherit from BaseValidator 并实现 IValidator,这意味着您应该将 RecaptchaControl 类型更改为继承自 BaseValidator 而不是 WebControl。然后,您必须稍微修改代码以实现BaseValidator 中定义的所有方法和属性。然后你可以在你的页面上使用这个新控件,它现在支持ValidationGroup

          【讨论】:

          • 嗨,bzlm。我已经完成了上述操作,但有两个问题:1)BaseValidator 还要求您实现抽象的 EvaluateIsValid() 方法(用它重新调用 IsValid 属性不起作用)。 2) reCaptcha 控件需要填写 ControlToValidate 属性。你能帮忙解决这些问题吗?谢谢。
          • 我注释掉了由 reCAPTCHA 插件提供的 IValidator 实现,并将该逻辑推送到 EvaluateIsValid() 方法中。我还在代码中绕过了 ControlToValidate 属性,因为它似乎不适用于这种情况。要实现的另一点是,您应该处理在页面上多次调用 validate 的情况。您需要确保实际上没有调用 reCAPTCHA API 两次,因为这会使控件无效。希望这会有所帮助。
          • 您好,能否获得有关如何执行此操作的更多信息?或者有人已经完成了可以分享的项目?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-17
          • 2010-12-02
          • 1970-01-01
          • 2012-03-15
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          相关资源
          最近更新 更多