jquery 如何通过 AJAX 调用发送AntiForgeryToken

ua4mk5z4  于 2023-08-04  发布在  jQuery
关注(0)|答案(1)|浏览(130)

在我的索引视图中,对于列表中的每一项,都有一个用于删除记录的actionlink。操作链接url的类型为“/Controller/Delete/id
当操作链接被点击时,一个模态弹出窗口要求确认,然后一个post请求被发送到控制器。
问题是我无法通过 AJAX 调用发送防伪令牌。
下面是控制器方法(仅用于测试):

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
{
    try
    {
        Group g = db.Groups.Find(id);
        if (g != null)
        {
            db.Groups.Remove(g);
            db.SaveChanges();
            var url = Url.Action("IndexPartial");
            
            return Json(new
            {
                success = true,
                message = "deletion completed successfully",
                redirectUrl = url
            });
        }
        else
        {
            return Json(new
            {
                success = false,
                message = "Not found"
            });
        }
    }
    catch (Exception ex)
    {
        return Json(new
        {
            success = false,
            message = ex.Message.ToString()
        });
    }
}

字符串
在Index视图中,我添加了:

@Html.AntiForgeryToken()


AJAX 调用的JavaScript代码

$('#confirmActionBtn').on('click', function () {

        var token = $('[name="__RequestVerificationToken"]').val(); // Get the AntiForgeryToken value

        $.ajax({
            url: actionConfirmModal.attr("data-actionUrl"),
            type: 'POST',
            contentType: 'application/json',
            headers: {'RequestVerificationToken':token},
            success: function (response) {
                setupModal('result');
                if (response.success) {
                    if (response.redirectUrl != null) {
                        var targetPlaceHolder = actionConfirmModal.attr("data-targetPlaceHolder");
                        if (targetPlaceHolder != null) {
                            targetPlaceHolder.load(redirectUrl);
                        }
                        else {
                            window.location.href = redirectUrl;
                        }
                    }
                    else {
                        //do something
                    }
                }
                else {
                    $('#resultMessage').text("Errore : " + response.message);
                }
            },
            error: function (xhr, status, error) {
                setupModal('result');
                $('#resultMessage').text("Errore : " + error);
            },
        });

    });


当我运行代码时,我得到错误:
所需的防伪表单字段“__RequestVerificationToken”不存在。

bnl4lu3b

bnl4lu3b1#

使用$. AJAX 数据属性在请求体(而不是头)中传递__RequestVerificationToken值:

var token = $('[name="__RequestVerificationToken"]').val();

$.ajax({
    url: actionConfirmModal.attr("data-actionUrl"),
    type: 'POST',
    //contentType: 'application/json',
    //headers: {'__RequestVerificationToken':token},
    data: { __RequestVerificationToken: token },
    success: function (response) {
        ...
    },
});

字符串
或者,至少将有效载荷(头部)键重命名为“__RequestVerificationToken”。
标签:include antiforgerytoken in ajax post ASP.NET MVC

相关问题