【发布时间】:2010-09-18 21:11:02
【问题描述】:
我正在使用reCAPTCHA 提供的 ASP.Net 插件和控件。如果 web 表单上的提交按钮不在验证组中,我可以成功地使控件工作。 reCAPTCHA 控件没有验证组属性。
当 web 表单上有验证组时,是否有人在此或任何解决方案方面取得了成功,以使 reCAPTCHA 控件正常工作?
【问题讨论】:
我正在使用reCAPTCHA 提供的 ASP.Net 插件和控件。如果 web 表单上的提交按钮不在验证组中,我可以成功地使控件工作。 reCAPTCHA 控件没有验证组属性。
当 web 表单上有验证组时,是否有人在此或任何解决方案方面取得了成功,以使 reCAPTCHA 控件正常工作?
【问题讨论】:
为了在不更改 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。
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
}
}
【讨论】:
我以为我会用一些工作代码来扩展 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 的想法。
【讨论】:
查看作为 Altairis Web UI 工具包一部分的 ReCaptchaImage 和 ReCaptchaValidator 控件:http://altairiswebui.codeplex.com/
它是一组开源的 Web 组件,包含相当不错且符合 ASP.NET 标准(如果我可以说它是作者 :-) ReCaptcha for Web Forms 的实现。
【讨论】:
这对我有用...
使用正确的验证组添加自定义验证器。
它的 ServerValidate 方法调用..
recaptcha.Validate();
然后在你的主要处理之前检查如下...
if (Page.IsValid && recaptcha.IsValid) { respose.write("有效"); }
HTH。
【讨论】:
您可以添加 CustomValidator,实现将验证 ReCAPTCHA 数据的 OnServerValidate。 CustomValidator 可以分配给任何 ValidatorGroup。
【讨论】:
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。
【讨论】: