noCAPTCHA reCAPTCHA 在 UpdatePanel 中消失
noCAPTCHA reCAPTCHA disappearing in UpdatePanel
我正在使用 VB.Net 将 noCAPTCHA reCAPTCHA 实施到现有表单中。它位于 UpdatePanel 中,并使用服务器端验证来验证用户是否已完成验证码(参见 )
如果用户验证码或任何其他验证字段失败,验证码将因回发而无法重新加载。如何解决这个问题并使验证码在回发后不会消失?
我的验证码:
<div id="captcha" class="g-recaptcha" runat="server" data-sitekey="MySiteKey"></div>
api.js放在Site.Masterheader.
<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 的 body 并将其放入 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 的 code-behind 中创建了一个函数,如下所示:
Public Sub TriggerCaptchaReload()
noCaptcha.Update()
End Sub
当用户尝试验证并提交表单时
如果他们失败了,我尝试使用
使更新面板刷新
CType(Me.Page.Master, MasterPage).TriggerCaptchaReload()
位于控制代码后面。
这没有用。也许可以找到一个潜在的解决方案?
为了解决这个问题,我做了以下事情:
我的验证码更改为以下div:
<div id="recaptcha" class="recaptcha"></div>
然后我通过将 api link 更改为以下内容并将其放置在上面的 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>
在后面的代码中,如果验证码失败,我会使用
重新加载验证码
ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "loadCaptcha", "grecaptcha.render('recaptcha', {'sitekey': 'MySiteKey' });", True)
这解决了我在更新面板中重新验证的问题。使用带有相同 class 名称元素的循环的 pageLoad 函数,然后使用您的密钥呈现。
function pageLoad(sender, args) {
$('.g-recaptcha').each(function (index, obj) {
grecaptcha.render(obj, { 'sitekey': 'XXXXXXXXXXXX-XX' });
});
}
我正在使用 VB.Net 将 noCAPTCHA reCAPTCHA 实施到现有表单中。它位于 UpdatePanel 中,并使用服务器端验证来验证用户是否已完成验证码(参见
如果用户验证码或任何其他验证字段失败,验证码将因回发而无法重新加载。如何解决这个问题并使验证码在回发后不会消失?
我的验证码:
<div id="captcha" class="g-recaptcha" runat="server" data-sitekey="MySiteKey"></div>
api.js放在Site.Masterheader.
<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 的 body 并将其放入 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 的 code-behind 中创建了一个函数,如下所示:
Public Sub TriggerCaptchaReload()
noCaptcha.Update()
End Sub
当用户尝试验证并提交表单时
如果他们失败了,我尝试使用
使更新面板刷新CType(Me.Page.Master, MasterPage).TriggerCaptchaReload()
位于控制代码后面。
这没有用。也许可以找到一个潜在的解决方案?
为了解决这个问题,我做了以下事情:
我的验证码更改为以下div:
<div id="recaptcha" class="recaptcha"></div>
然后我通过将 api link 更改为以下内容并将其放置在上面的 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>
在后面的代码中,如果验证码失败,我会使用
重新加载验证码ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "loadCaptcha", "grecaptcha.render('recaptcha', {'sitekey': 'MySiteKey' });", True)
这解决了我在更新面板中重新验证的问题。使用带有相同 class 名称元素的循环的 pageLoad 函数,然后使用您的密钥呈现。
function pageLoad(sender, args) { $('.g-recaptcha').each(function (index, obj) { grecaptcha.render(obj, { 'sitekey': 'XXXXXXXXXXXX-XX' }); }); }