为 cshtml 文件中的 2 个按钮发送 2 个 recaptcha v3 令牌的问题

Problem of sending 2 recaptcha v3 token for 2 button in cshtml file

我的 cshtml 文件中有两个按钮。对于第一个按钮,我可以将 recaptcha v3 令牌发送到我的控制器。但是如果我尝试从我的第二个按钮发送令牌,它将 null 作为令牌发送到控制器。我的代码在下面,我不知道哪里出了问题。如何从第二个按钮发送 v3 令牌?

@using (Html.BeginForm("myaction", "mycontroller", FormMethod.Post))
{
    @Html.TextBoxFor(model => model.text)
    @Html.HiddenFor(model => model.pagenumber)
    <input id="token" name="token" type="hidden" />
    <input id="submit" type="submit" value="Show comments" />
}

@using (Html.BeginForm("myaction", "mycontroller", FormMethod.Post))
{
    @Html.TextBoxFor(model => model.text)
    @Html.HiddenFor(model => model.pagenumber)
    <input id="token" name="token" type="hidden" />
    <input id="submit" type="submit" value="Show comments" />
}





<script src="https://www.google.com/recaptcha/api.js?render=mysitekey
"></script>
<script>grecaptcha.ready(function () {
    grecaptcha.execute('mysitekey', { action: 'submit' }).then(function (token) {

        document.getElementById("token").value = token;


        });

    });</script>

您正在使用 getElementById,它找到的第一个元素 returns 与 Id 相匹配,这就是为什么只有一种形式适合您(ID 应该是唯一的,并且您不应有两个具有相同 ID 的元素)。

这就是我们 类 来识别多个元素的原因。所以只需将两个输入上的 id="token" 替换为 class="token" 然后你就可以像这样替换它们的值:

   var elements = document.querySelectorAll('.token');
    elements.forEach(function(element){
        element.value = token;
    });

更新

ActionLink 是一个标签助手,它在服务器上呈现给锚标签 <a>,并且由于您是在客户端获取令牌,因此您必须获取该锚标签并使用 Javascript.

将您的令牌作为参数附加到其 href 属性

像这样:

let element = document.querySelector("Your link id or class");
let attribute = element.getAttribute('href');
element.setAttribute('href', attribute + '?token=' + token);