【问题标题】:Should AntiForgeryToken be inside or outside of the loop?AntiForgeryToken 应该在循环内部还是外部?
【发布时间】:2021-01-05 06:39:27
【问题描述】:

我们目前有这个代码

@foreach (var market in Model.Markets.Markets)
{
    <li>
        @using (Html.BeginForm("Set", "Market", new {marketId = market.Value}, FormMethod.Post, null))
        {
            @Html.AntiForgeryToken()
            <button class="btn btn-none market-list__item jsSelectMarket">
                <img src="@market.FlagUrl" class="market-selector__market-icon">
                <p class="market-selector__market-text">@market.Text</p>
            </button>
        }
    </li>
}

看起来是正确的,但分析表明大量 CPU 时间用于生成防伪令牌(基本上每页 20 次仅用于此目的)。

有没有办法将 @Html.AntiForgeryToken() 移到 foreach 之外,所以它只被称为一个?

谢谢。

【问题讨论】:

  • 如果您通过 ajax 发布,那么您可以将 @Html.AntiForgeryToken() 保留在循环之外,并在发送 ajax 时通过读取 _RequestVerificationToken 隐藏字段将其添加到。
  • 我写了一堆,然后删除了......我认为你真正的问题是这不应该是一个帖子,所以不需要表单,所以不需要 AntiForgeryToken....只需在 url 中包含值...路径并返回帖子的内容。
  • 使按钮成为样式锚,其链接看起来与按钮相同......
  • @RajdeepDebnath 好主意,我会试试的。谢谢

标签: asp.net asp.net-mvc model-view-controller antiforgerytoken


【解决方案1】:

您应该使用 Ajax。
您可以尝试使用以下代码作为 post 的通用方法

function AjaxPostMethod(url, formName, parameters, successCallback) {

    $.validator.unobtrusive.parse($(formName));

    $(formName).validate();
    
    if ($(formName).valid()) {
        var form = $(formName);
        var token = $('input[name="__RequestVerificationToken"]', form).val();

        $.ajax({
            type: 'POST',
            url: url,
            data:
            {
                __RequestVerificationToken: token,
                model: parameters
            },
            success: successCallback,
            error: function (xhr, textStatus, errorThrown) {
                console.log('error');
            }
        });
    }

一气呵成

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2014-03-24
    • 2014-03-18
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多