如果 reCaptcha 仍未完成,则停止或中断用户登录

stop or interrupt the user from logging in if reCaptcha is still unaccomplished

我试图从 c# 代码隐藏中禁用登录模板内的按钮,我已经尝试从前端的 javascript 方法执行此操作,但我无法让它工作。参见 here!

这是我正在做的事情:

Javascript方法:

<script type="text/javascript">
     var resetCaptcha = function () {
        alert("Confirmation Expired. Please Answer Recaptcha.");
        PageMethods.disable();
        grecaptcha.reset();
    };
</script>

调用函数的地方:

<div class="g-recaptcha" data-sitekey="site-key" data-theme="dark"
data-expired-callback="resetCaptcha" data-callback="DisableButton"></div>

代码隐藏方法:

    [WebMethod]
    public void disable()
    {
        Button btn = new Button();
        btn = LoginUser.FindControl("LoginButton") as Button;
        btn.Enabled = false;

    }

我也声明了:

<asp:ScriptManager ID="ScriptMgr" runat="server" EnablePageMethods="true">
</asp:ScriptManager>

但是当验证码成功完成时,我仍然得到这个错误:

Microsoft JScript runtime error: 'PageMethods' is undefined

有人可以帮我吗?我错过了什么?

你想做的事永远不会奏效。您不能通过 PageMethod 访问页面中的控件;它在正常的 ASP.NET 生命周期之外运行。但是您可以使用 JavaScript 来禁用控件:

$get("<%= LoginButton %>").disabled = "disabled";

这只适用于客户端,不会持久存在于服务器上。注意 $get() 是 ASP.NET AJAX 获取控件的方法,document.getElementById 做同样的事情。

我能够做我想做的事,(在登录前测试 recaptcha 的有效性),使用 OnLoggingIn 事件而不是手动 enabling/disabling 登录按钮。

我实际上能够从代码隐藏控制前端 asp.net 标签的 属性。

使用这行代码:

(LoginUser.FindControl("RecaptchaRequired") as Label).Text = "Please answer reCaptcha";

其中 LoginUserloginTemplate 的 ID,RecaptchaRequired 是模板内的标签。

刚才,我意识到我试图用错误的方法来完成某件事..