noCAPTCHA reCAPTCHA在UpdatePanel中消失

时间:2015-05-15 13:02:55

标签: asp.net vb.net updatepanel recaptcha

我使用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()

位于后面的控制代码上。

这没有用。也许有一个潜在的解决方案可以找到它?

2 个答案:

答案 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失败后面的代码中我用

重新加载CAPTCHA
ScriptManager.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' });
                });

            }