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