AntiforgeryToken在Ajax调用中未被识别
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的截图
我的 action 方法上有 ValidateAntiForgeryToken 属性
[HttpPost] [Authorize] [ValidateAntiForgeryToken] public ActionResult MainMenu(int modid) { }
是什么导致了这个问题?有什么想法吗?
编辑:
这是一个MVC5项目。
在进行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未被识别的问题。
问题原因是在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中。
谢谢,我以前不知道这一点。