我使用VB.Net将noCAPTCHA reCAPTCHA实现到现有表单中。它位于UpdatePanel中,并使用服务器端验证来验证用户是否已完成CAPTCHA(请参阅Validating Recaptcha 2 (No CAPTCHA reCAPTCHA) in ASP.NET's server side)
如果用户未能通过CAPTCHA或任何其他经过验证的字段,则由于回发,CAPTCHA无法重新加载。如何解决这个问题,以便在回发后CAPTCHA不会消失?
我的验证码:
<div id="captcha" class="g-recaptcha" runat="server" data-sitekey="MySiteKey"></div>
api.js放在Site.Master标题中。
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
扩展。
我尝试过一种解决方案,但最终失败了。我添加了
<div id="captcha" class="g-recaptcha" runat="server" data-sitekey="MySiteKey"></div>
到我的MasterPage的主体并将其放在UpdatePanel中,给它一个id,等等。
<asp:UpdatePanel UpdateMode="Conditional" runat="server" ID="noCaptcha">
<ContentTemplate>
<asp:ScriptManager runat="server"></asp:ScriptManager>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</ContentTemplate>
</asp:UpdatePanel>
然后我在Site Master的代码隐藏中创建了一个函数,如下所示:
Public Sub TriggerCaptchaReload()
noCaptcha.Update()
End Sub
当用户尝试验证并提交表单时
如果失败,我尝试使用
刷新更新面板CType(Me.Page.Master, MasterPage).TriggerCaptchaReload()
位于后面的控制代码上。
这没有用。也许有一个潜在的解决方案可以找到它?
答案 0 :(得分:12)
要解决此问题,我执行了以下操作:
我的CAPTCHA代码更改为以下div:
<div id="recaptcha" class="recaptcha"></div>
然后我通过将api链接更改为以下内容并将其放在上面的div下面,继续在reCAPTCHA上实现显式渲染。
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
async defer>
</script>
在我收录的标题中
<script type="text/javascript">
var onloadCallback = function () {
grecaptcha.render('recaptcha', {
'sitekey': 'MySiteKey'
});
};
</script>
如果CAPTCHA失败后面的代码中我用
重新加载CAPTCHAScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "loadCaptcha", "grecaptcha.render('recaptcha', {'sitekey': 'MySiteKey' });", True)
答案 1 :(得分:-1)
这解决了我在更新面板中重新访问的问题。将pageLoad函数与具有相同类名的元素的循环一起使用,然后使用您的密钥进行渲染。
function pageLoad(sender, args) { $('.g-recaptcha').each(function (index, obj) { grecaptcha.render(obj, { 'sitekey': 'XXXXXXXXXXXX-XX' }); }); }