AntiforgeryToken在Ajax调用中未被识别

10 浏览
0 Comments

AntiforgeryToken在Ajax调用中未被识别

我有一个情景,在这个情景中,我不需要通过ajax调用发送表单数据,而是其他数据。我有一个包含html.AntiForgeryToken()的表单。

这是我尝试的代码。

var modid = $("#moduleList").val();
var data = {};
data.modid = modid;
var token = $('#frmmmenu input[name="__RequestVerificationToken"]').val();
data.__RequestVerificationToken = token;
//var dataWithToken = $.extend(data, token);
$.ajax({
    type: "POST",
    url: "Home/MainMenu",
    data: JSON.stringify(data),
    //contentType: "application/json; charset=utf-8",  // 请求数据类型
    dataType: "html",  // 响应数据类型
    success: function (msg) {
        $("#accordion").html(msg);
    },
    error: function (msg) {
        alert("Ajax错误");
    },
});

但是我一直收到 The required anti-forgery form field "__RequestVerificationToken" is not present 的错误。

这是Firebug的截图

enter image description here

我的 action 方法上有 ValidateAntiForgeryToken 属性

[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public ActionResult MainMenu(int modid)
{
}

是什么导致了这个问题?有什么想法吗?

编辑

这是一个MVC5项目。

0
0 Comments

在进行Ajax调用时,出现了AntiforgeryToken未被识别的问题。造成这个问题出现的原因可能是因为在Ajax调用中没有正确传递AntiforgeryToken的值。

解决这个问题的方法是在Ajax调用中正确传递AntiforgeryToken的值。具体的解决方法如下:

1. 在JS代码中,找到form元素,并设置相应的input元素的值。这些值可能是特定于每个案例的,需要根据实际情况进行设置。

2. 使用jQuery的serialize()函数将表单数据序列化为字符串,并将其作为data参数传递给Ajax调用。

3. 在CSHTML文件中,确保在form元素中添加了AntiForgeryToken()方法,以生成AntiforgeryToken的隐藏字段。

4. 在Ajax调用的url参数中使用form的action属性。

5. 在服务器端处理Ajax请求时,确保验证AntiforgeryToken的值与服务器端生成的值匹配。

通过以上步骤,可以解决AntiforgeryToken未被识别的问题。

0
0 Comments

问题原因是在Ajax调用中,使用了JSON.stringify(data)进行数据的传递,而应该直接传递data。解决方法是修改代码为data: data。通过这样的修改,可以正常显示AntiforgeryToken。

同时,希望有人可以提供一个使用JSON作为URL的解决方案,尽管这需要application/x-www-form-urlencoded的contentType。

感谢大家的支持。

当前的解决方法是正确的:URL长度是有限的,但是当你通过jQuery AJAX进行POST请求时,并没有使用URL。你可能正在使用“url-encoded”内容,但这只是意味着它遵循URL编码的结构(与JSON、CSV或其他内容不同)。它仍然被包含在消息体中,而不是URL中。

谢谢,我以前不知道这一点。

0