从主页面控制触发Recaptcha

时间:2010-05-17 23:13:49

标签: asp.net validation forms recaptcha login-control

我有一个包含Login控件的母版页,以便用户可以从任何页面登录/注销。但是,一些内容页面需要Recaptcha控件。这会导致问题,因为当我尝试登录具有Recaptcha控件的页面时,系统希望我输入单词。我知道Recaptcha控件中缺少验证组,并且您无法在ASP.NET页面上拥有多个表单。有办法解决这个问题吗? 我能想到的一种“hacky”方式是在“登录”事件中,检查页面上的Recaptcha控件。如果存在,则禁用它,否则继续。然而,这似乎效率很低,特别是当有很多页面并且大多数页面没有Recaptcha控件时。

4 个答案:

答案 0 :(得分:3)

此问题的解决方法如下:

  1. 将ValidationGroup设置为“登录”按钮。当单击ValidationGroup设置为非空的按钮时,reCAPTCHA控件将不会验证。
  2. 在需要reCAPTCHA验证的页面上,将按钮的ValidationGroup值保持为非空(否则,也将验证登录字段),但在子例程上手动调用RecaptchaControl.Validate()。
  3. Discussion thread上的

    official reCAPTCHA dev mailing list

答案 1 :(得分:0)

您应该做的是以下内容:

<form runat="server"></form>

应该包含在整个页面内容中,因为登录也在主页上。

从这一点开始,您可以在从给定母版页派生的任何页面上删除recaptcha控件。您无需在任何地方添加其他<form runat="server"></form>标记。

您必须了解recaptcha控件既不会绑定到 html表单提交按钮,也不会绑定到任何其他特定按钮。每次页面回发时,recaptcha都会设置Page.IsValid标志。

遗憾的是,通过使用触发验证和验证组,recaptcha不遵循ASP.NET标准 因此,为了防止每次重新验证重新验证,您必须设置:SkipRecaptcha = true

这导致recaptcha无法验证。所以现在覆盖了登录方案。如果您想要实际使用重新接收功能,只需设置SkipRecaptcha = false并致电Page.Validate()即可。之后,您可以像Page.IsValid一样继续使用。

更简洁,更好的方法是重写recaptcha控件以使用BaseValidator类。这将允许您在recaptcha控件上指定验证组,并通过recaptcha指定要保护的输入的按钮。按下按钮将仅导致验证指定的验证组 此外,您必须为登录按钮指定验证组或设置CausesValidation = false。如果未设置验证组并且按下该按钮,则会自动验证所有验证组 然而这是非常先进的,所以即使是recaptcha的人也放弃了,但是在源代码控制中仍然有一个旧版本。无法保证该版本仍然有效。让我们知道你是如何决定的。

答案 2 :(得分:0)

我不是百分之百确定这是相关的,但我在每次回发时触发了ReCaptcha控件的问题 - IsValid属性逻辑存在缺陷。我修复了这个特殊问题:http://code.google.com/p/recaptcha/issues/detail?id=56#c3

不幸的是,ReCaptcha项目有些停滞不前,并且已经有一段时间没有修复它了。

答案 3 :(得分:0)

我与母版页中的登录控件处于完全相同的位置,并且SkipRecaptcha=true;设置对我不起作用。页面仍然无法通过验证,我的LoggingIn事件从未在母版页中触发。

我见过无数的变通办法,包括更新稀疏支持的Recapta,但我决定只是选择性地从等式中删除它。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostback && Request["__EVENTTARGET"] == "ctl00$Login1$loginbuttonID")
        Page.Validators.Remove(recaptcha);
}